将Windows批处理文件变量设置为星期几

Ed *_*eal 19 windows scripting batch-file

我有一个每天运行的Windows批处理文件.希望将数据记录到文件中并希望将其旋转(即最多拥有最近7天的数据).

查看命令DATEDELIMS- 无法找出解决方案.

是否有一个简单的解决方案来创建一个包含星期几的文件名,即星期一为0等.

或者我必须采用一些更好的shell脚本.

PA.*_*PA. 30

%DATE%不是你的朋友.因为%DATE%环境变量(和DATE命令)使用完全且无限可自定义的Windows 短日期格式返回当前日期.一个用户可以将系统配置为返回07/06/2012,而另一个用户可以选择Fri060712.%DATE%对于BAT程序员来说,使用是一个彻底的噩梦.

有两种方法可以解决这个问题:

  1. 您可能想要通过将注册表值中的区域设置更改为HKCU\Control Panel\International\sShortDate可识别的格式来临时更改短日期格式.然后访问%DATE%以您想要的格式获取日期; 最后将格式恢复为原始用户格式.像这样的东西

    reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul
    reg add "HKCU\Control Panel\International" /v sShortDate /d "ddd" /f >nul
    set DOW=%DATE%
    reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul
    
    Run Code Online (Sandbox Code Playgroud)

    但这种方法有两个问题:

    • 它会篡改其本地特定用户的全局注册表值,因此它可能会干扰其他进程或用户任务,同时以短日期格式查询日期,包括同时运行的自身.

    • 它以本地语言返回一周中的三个字母的日期,在不同的系统或不同的用户中可能会有所不同.

  2. 使用WMIC Win32_LocalTime,它以方便的方式返回日期,直接用FOR命令解析它.

    FOR /F "skip=1" %%A IN ('WMIC Path Win32_LocalTime Get DayOfWeek' ) DO (
      set DOW=%%A
    )
    
    Run Code Online (Sandbox Code Playgroud)

    这是我推荐的方法.

  • +1:`for/f %% a in('wmic path win32_localtime get dayofweek/format:list ^ | findstr"="')do(set %% a)`也是可行的,并自动获得所需的值名为`DayOfWeek`的变量. (21认同)
  • @EitanT`/ format:list`成了我的一天. (3认同)
  • 然后如何在循环外回应"DOW"?换句话说,如何访问该变量? (2认同)
  • 方法2在我的Win 8.1上不起作用,因为“ WMIC Path Win32_LocalTime Get DayOfWeek”具有3个字符串,最后一个-空,因此我修改了代码:FOR / F“ skip = 1” %% A IN('WMIC Path Win32_LocalTime Get DayOfWeek')DO(set DOW = %% A goto:break):break echo%DOW% (2认同)

npo*_*aka 13

更多方法:

1. Robocopy在XP中不可用,但可以使用win 2003资源工具包下载.也可能取决于本地化:

@echo off
setlocal 
for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
 set "dow=%%D"
 set "month=%%E"
 set "day=%%F"
 set "HH=%%G"
 set "MM=%%H"
 set "SS=%%I"
 set "year=%%J"
)

echo Day of the week: %dow%
endlocal
Run Code Online (Sandbox Code Playgroud)

2. MAKECAB - 适用于每台Windows机器(但会创建一个小的临时文件).carlos提供的功能:

@Echo Off


Call :GetDate.Init
Rem :GetDate.Init should be called one time in the code before call to :Getdate
Call :GetDate
Echo weekday:%weekday%

Goto :EOF

:GetDate.Init
Set /A "jan=1,feb=2,mar=3,apr=4,may=5,jun=6,jul=7,aug=8,sep=9,oct=10,nov=11,dec=12"
Set /A "mon=1,tue=2,wed=3,thu=4,fri=5,sat=6,sun=7"
(
Echo .Set InfHeader=""
Echo .Set InfSectionOrder=""
Echo .Set InfFooter="%%2"
Echo .Set InfFooter1=""
Echo .Set InfFooter2=""
Echo .Set InfFooter3=""
Echo .Set InfFooter4=""
Echo .Set Cabinet="OFF"
Echo .Set Compress="OFF"
Echo .Set DoNotCopyFiles="ON"
Echo .Set RptFileName="NUL"
) >"%Temp%\~foo.ddf"
Goto :Eof

:GetDate
Set "tf=%Temp%\~%random%"
Makecab /D InfFileName="%tf%" /F "%Temp%\~foo.ddf" >NUL
For /F "usebackq tokens=1-7 delims=: " %%a In ("%tf%") Do (
Set /A "year=%%g,month=%%b,day=1%%c-100,weekday=%%a"
Set /A "hour=1%%d-100,minute=1%%e-100,second=1%%f-100")
Del "%tf%" >NUL 2>&1
Goto :Eof
Run Code Online (Sandbox Code Playgroud)

3. W32TM - 使用Vista中引入的命令开关,因此无法在Windows 2003/XP上运行:

@echo off
setlocal
call :w32dow day_ow
echo %day_ow%
pause
exit /b 0
endlocal
:w32dow [RrnVar]
setlocal

rem :: prints the day of the week
rem :: works on Vista and above


rem :: getting ansi date ( days passed from 1st jan 1601 ) , timer server hour and current hour
FOR /F "tokens=4,5 delims=:( " %%D in ('w32tm /stripchart /computer:localhost  /samples:1  /period:1 /dataonly /packetinfo^|find "Transmit Timestamp:" ') do (
 set "ANSI_DATE=%%D"
 set  "TIMESERVER_HOURS=%%E"
)

set  "LOCAL_HOURS=%TIME:~0,2%"
if "%TIMESERVER_HOURS:~0,1%0" EQU "00" set TIMESERVER_HOURS=%TIMESERVER_HOURS:~1,1%
if "%LOCAL_HOURS:~0,1%0" EQU "00" set LOCAL_HOURS=%LOCAL_HOURS:~1,1%
set /a OFFSET=TIMESERVER_HOURS-LOCAL_HOURS

rem :: day of the week will be the modulus of 7 of local ansi date +1
rem :: we need need +1 because Monday will be calculated as 0
rem ::  1st jan 1601 was Monday

rem :: if abs(offset)>12 we are in different days with the time server

IF %OFFSET%0 GTR 120 set /a DOW=(ANSI_DATE+1)%%7+1
IF %OFFSET%0 LSS -120 set /a DOW=(ANSI_DATE-1)%%7+1
IF %OFFSET%0 LEQ 120 IF %OFFSET%0 GEQ -120 set /a DOW=ANSI_DATE%%7+1


rem echo Day of the week: %DOW% 
endlocal & if "%~1" neq "" (set "%~1=%DOW%") else echo %DOW%
Run Code Online (Sandbox Code Playgroud)

4. .bat/jscript hybrid(必须保存为.bat):

 @if (@x)==(@y) @end /***** jscript comment ******
 @echo off
 for /f  %%d in ('cscript //E:JScript //nologo "%~f0"') do echo %%d
 exit /b 0
 *****  end comment *********/
 WScript.Echo((new Date).getDay());
Run Code Online (Sandbox Code Playgroud)

5. .bat/vbscript hybrid (必须保存为.bat)

 :sub echo(str) :end sub
echo off
'>nul 2>&1|| copy /Y %windir%\System32\doskey.exe '.exe >nul

'& echo/ 
'& for /f %%w in ('cscript /nologo /E:vbscript %~dpfn0') do echo day of the week %%w
'& echo/
'& del /q "'.exe" >nul 2>&1
'& exit /b

WScript.Echo Weekday(Date)
WScript.Quit
Run Code Online (Sandbox Code Playgroud)

6. powershell可以从microsoft下载.默认情况下可以在win7及以上版本中使用:

@echo off
setlocal
for /f %%d in ('"powershell (Get-Date).DayOfWeek.Value__"') do set dow=%%d

echo day of the week : %dow%
endlocal
Run Code Online (Sandbox Code Playgroud)

7. WMIC已经作为答案使用,但只想获得完整的参考.并清除<CR>:

@echo off
setlocal
for /f "delims=" %%a in ('wmic path win32_localtime get dayofweek /format:list ') do for /f "delims=" %%d in ("%%a") do set %%d

echo day of the week : %dayofweek%
endlocal
Run Code Online (Sandbox Code Playgroud)

9. 自编译的jscript.net(必须保存为.bat):

@if (@X)==(@Y) @end /****** silent line that start jscript comment ******

@echo off
::::::::::::::::::::::::::::::::::::
:::       compile the script    ::::
::::::::::::::::::::::::::::::::::::
setlocal
if exist "%~n0.exe" goto :skip_compilation

set "frm=%SystemRoot%\Microsoft.NET\Framework\"
:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
    if exist "%%v\jsc.exe" (
        rem :: the javascript.net compiler
        set "jsc=%%~dpsnfxv\jsc.exe"
        goto :break_loop
    )
)
echo jsc.exe not found && exit /b 0
:break_loop


call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
::::::::::::::::::::::::::::::::::::
:::       end of compilation    ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation

"%~n0.exe"

exit /b 0


****** end of jscript comment ******/
import System;
import System.IO;

var dt=DateTime.Now;
 Console.WriteLine(dt.DayOfWeek);
Run Code Online (Sandbox Code Playgroud)


Aac*_*ini 6

@ECHO OFF
REM GET DAY OF WEEK VIA DATE TO JULIAN DAY NUMBER CONVERSION
REM ANTONIO PEREZ AYALA
REM GET MONTH, DAY, YEAR VALUES AND ELIMINATE LEFT ZEROS
FOR /F "TOKENS=1-3 DELIMS=/" %%A IN ("%DATE%") DO SET /A MM=10%%A %% 100, DD=10%%B %% 100, YY=%%C
REM CALCULATE JULIAN DAY NUMBER, THEN DAY OF WEEK
IF %MM% LSS 3 SET /A MM+=12, YY-=1
SET /A A=YY/100, B=A/4, C=2-A+B, E=36525*(YY+4716)/100, F=306*(MM+1)/10, JDN=C+DD+E+F-1524
SET /A DOW=(JDN+1)%%7
Run Code Online (Sandbox Code Playgroud)

周日为0,星期一为1,等等.