将一个windowsbatch filevariables设置为星期几

我有一个每天运行的Windowsbatch file。 希望将数据logging到一个文件中并且想旋转它(即最多具有最后7天的数据)。

DELIMS DATEDELIMS命令 – 找不到解决scheme。

有没有一个简单的解决scheme来创build一个文件名,其中包含星期几,即0星期一等

或者我不得不诉诸一些更好的shell脚本

%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 

    但是这个方法有两个问题:

    • 它会篡改本地特定购买者的全局注册表值,所以它可能会干扰其他进程或用户任务,这些进程或用户任务同时以短日期格式查询日期,如果同时运行,也包括自身。

    • 并以不同的系统或不同的用户可能会有所不同的本地语言返回三个星期的星期几。

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

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

    这是我推荐的方法。

更少的方法:

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 

2. MAKECAB – 在每个Windows机器上工作(但创建一个小的临时文件)。 卡洛斯提供的功能:

 @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 

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% 

4.bat / jscript混合 (必须保存为.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()); 

5.bat / vbscript混合 (必须保存为.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 

6. powershell可以从微软下载。默认情况下,win7及以上版本都可以使用。

 @echo off setlocal for /f %%d in ('"powershell (Get-Date).Day"') do set dow=%%d echo day of the week : %dow% endlocal 

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 

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); 
 @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 /AA=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 

DOW星期天为0,星期一为1。

我以为我的第一个答案给出了一个0到6之间的数字。但是,因为你没有指出为什么这个答案不能给出你想要的结果,所以我只能猜出原因。

下面的批处理文件每天创建一个日志文件,名称中有一个数字,0 =星期日,1 =星期一等等。程序假定echo %date%以MM / DD / YYYY格式显示日期; 如果不是这种情况,只需在for命令中更改mm和dd变量的位置即可。

 @echo off for /F "tokens=1-3 delims=/" %%a in ("%date%") do set /A mm=10%%a %% 100, dd=10%%b %% 100, yy=%%c 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, dow=(c+dd+e+f-1523)%%7 echo Today log data > Day-%dow%.txt 

如果这不是你想要的,请指出问题,以便我可以修复它。

编辑 :下面的版本获取日期部分独立的区域设置:

 @echo off for /F "skip=1 tokens=2-4 delims=(-/)" %%A in ('date ^< NUL') do ( for /F "tokens=1-3 delims=/" %%a in ("%date%") do ( set %%A=%%a set %%B=%%b set %%C=%%c ) ) set /A mm=10%mm% %% 100, dd=10%dd% %% 100 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, dow=(c+dd+e+f-1523)%%7 echo Today log data > Day-%dow%.txt 

编辑 :下面的版本插入星期几作为3个字母的短名称:

 @echo off for /F "skip=1 tokens=2-4 delims=(-/)" %%A in ('date ^< NUL') do ( for /F "tokens=1-3 delims=/" %%a in ("%date%") do ( set %%A=%%a set %%B=%%b set %%C=%%c ) ) set /A mm=10%mm% %% 100, dd=10%dd% %% 100 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, dow=(c+dd+e+f-1523)%%7 + 1 for /F "tokens=%dow%" %%a in ("Sun Mon Tue Wed Thu Fri Sat") do set dow=%%a echo Today log data > Day-%dow%.txt 

问候,

安东尼奥

事实证明,当我第一次怀疑的时候,这种方式变得更加复杂,我想这就是我所感兴趣的,我搜索了在Windows 7上所有的方法。

所以我有一个使用Visual Basic脚本的备用解决方案。

批处理创建并执行脚本(DayOfWeek.vbs),将脚本输出(星期一,星期二等)分配给变量(dow),然后检查该变量并将另一个变量(dpwnum)分配给天数,之后VBS被删除希望它有助于:

 @echo off REM Create VBS that will get day of week in same directory as batch echo wscript.echo WeekdayName(Weekday(Date))>>DayOfWeek.vbs REM Cycle through output to get day of week ie monday,tuesday etc for /f "delims=" %%a in ('cscript /nologo DayOfWeek.vbs') do @set dow=%%a REM delete vbs del DayOfWeek.vbs REM Used for testing outputs days name echo %dow% REM Case of the days name is important must have a capital letter at start REM Check days name and assign value depending IF %dow%==Monday set downum=0 IF %dow%==Tuesday set downum=1 IF %dow%==Wednesday set downum=2 IF %dow%==Thursday set downum=3 IF %dow%==Friday set downum=4 IF %dow%==Saturday set downum=5 IF %dow%==Sunday set downum=6 REM print the days number 0-mon,1-tue ... 6-sun echo %downum% REM set a file name using day of week number set myfile=%downum%.bak echo %myfile% pause exit 

编辑:

虽然我转向VBS,可以纯粹的批量完成,花了我一段时间,让它工作,并大量搜索哈哈,但这似乎工作:

  @echo off SETLOCAL enabledelayedexpansion SET /a count=0 FOR /F "skip=1" %%D IN ('wmic path win32_localtime get dayofweek') DO ( if "!count!" GTR "0" GOTO next set dow=%%D SET /a count+=1 ) :next echo %dow% pause 

在上述批次中,唯一需要注意的是,它的周数是1-7,而不是0-6

这对我有用

 FOR /F "tokens=3" %%a in ('robocopy ^|find "Started"') DO SET TODAY=%%a 

这不是我的工作(嗯,我从示例中稍微修改了一下),并且这个游戏已经晚了,但是这对我来说是server 2003的工作。

 @echo off set daysofweek=Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday for /F "skip=2 tokens=2-4 delims=," %%A in ('WMIC Path Win32_LocalTime Get DayOfWeek /Format:csv') do set daynumber=%%A for /F "tokens=%daynumber% delims=," %%B in ("%daysofweek%") do set day=%%B 

引用: TechSupportForum

首先 – 复制CON SETUPDAY.001设置工作日= ^ Z(非常重要 – 没有cr / lf)

 DATE /T >SETUPDAY.002 COPY SETUPDAY.001+SETUPDAY.002 NEWDAY.BAT >nul CALL NEWDAY.BAT SET WEEKDAY=%WORKDAY:~0,3% SET MDY=%WORKDAY:~4,10% 

在您的脚本中使用%WEEKDAY%

区域依赖版本:在某些环境中,以下将从日期中提取日期名称:

 set dayname=%date:~0,3% 

它假定日期名称是%date%的第一部分。 但是,根据机器设置,子串部分( ~0,3 )需要改变。

像这样的陈述将转储到一个具有三个字符的日期名称的文件:

 set logfile=%date:~0,3%.log echo some stuff > %logfile% 

独立于语言环境的版本:如果您不需要依赖当前机器的日期格式,则另一种方法是编写一个小型应用程序来打印星期几。 然后从批处理文件中使用该程序的输出。 例如,下面的C应用程序打印dayN ,其中N = dayN

 #include <stdio.h> #include <time.h> int main( int argc, char* argv[] ) { time_t curtime; struct tm * tmval; time( &curtime ); tmval = localtime( &curtime ); // print dayN. Or use a switch statement and print // the actual day name if you want printf( "day%d", tmval->tm_wday ); } 

如果上面的代码是作为myday.exe编译和链接的,那么你可以像这样使用批处理文件:

 for /f %%d in ('myday.exe') do set logfile=%%d.log echo some stuff > %logfile% 

我在美国。 我可以在Windows 7,Windows 2008 R2,Windows server 2003,Windows XP中运行此代码(所有操作系统都是最新的Windows更新和修补程序)。 所有的短日期设置没有ddd(或dddd)(星期几)。

 @echo off for /f %%a in ('date /t') do set DAY=%%a echo. echo The Day Is: %DAY% echo. 

如果今天是星期四,它会输出“The Day Is:Thu”。

这将返回我测试过的所有4个Windows版本的一天。 而只有一天。 当我将短日期设置更改为“ddd,M / d / yyyy”时,我的输出会用逗号(例如Thu)显示当天的日期,告诉我这段代码使用短日期格式。 但也可能发生的是,如果短日期不包含星期几,则可能会看到在我测试的所有4台机器上的长日期格式,其格式为dddd。

我有这个解决方案为我工作:

在cmd文件所在的目录下创建一个名为dayOfWeek.vbs的文件。

dayOfWeek.vbs包含一行:

 wscript.stdout.write weekdayname(weekday(date)) 

或者,如果你想要天数而不是名字:

 wscript.stdout.write weekday(date) 

cmd文件将包含以下行:

 For /F %%A In ('CScript dayOfWeek.vbs //NoLogo') Do Set dayName=%%A 

现在你可以使用变量dayName

 robocopy c:\inetpub \\DCStorage1\Share1\Webserver\InetPub_%dayName% /S /XD history logs 

如果您可以将个人电脑中的短日期格式更改为“ddd yyyy-MM-dd”(只有第一个参数“ddd”是强制的),那么下面的命令返回 –

 c:\>vol | date The current date is: Mon 2014-12-01 

那么你可以写你的批处理文件 –

 @echo off vol | date | find /i "sun" > nul if not errorlevel 1 goto SUN vol | date | find /i "mon" > nul if not errorlevel 1 goto MON # write block for other week days goto END :SUN set fname="sun" goto BACKUP :MON set fname="mon" goto BACKUP # write block for other week days :BACKUP echo %fname% :END 
 Rem Remove the end comma and add /A to set for this line worked for me. set /A a=yy/100, b=a/4, c=2-a+b, e=36525*(yy+4716)/100, f=306*(mm+1)/10 

正在寻找自己做这件事,看到空白线路的投诉:

 rem Make the win32_localtime output all one line, though some versions may contain blank lines as well. rem So ignore blank lines and just pick up the number after the equal sign. for /f "delims== tokens=2" %%a in ('wmic path win32_localtime get dayofweek /format:list') do ( rem Increment the DOW as it is documented to be a zero-based index starting with Sunday. set /a DayOfWeekIndex=%%a+1 ) rem Also get name day of week. The DOW coming in is now a one-based index. rem This is used to reference the "array" of week day names. set DayOfWeekNames=Sun Mon Tue Wed Thu Fri Sat for /f "tokens=%DayOfWeekIndex%" %%b in ("%DayOfWeekNames%") do ( set DayOfWeekName=%%b ) 

使用MSHTA和JavaScript的版本。 将%jsfunc%更改为您要调用的whateve jscript函数

 @echo off ::Invoke a javascript function using mhta set jsfunc=new Date().getDay() set dialog="about:<script>resizeTo(0,0);new ActiveXObject('Scripting.FileSystemObject'). set dialog=%dialog%GetStandardStream(1).WriteLine(%jsfunc%);close();</script>" for /f "tokens=* delims=" %%p in ('mshta.exe %dialog%') do set ndow=%%p ::get dow string from array of strings for /f "tokens=%ndow%" %%d in ("Mon Tue Wed Thu Fri Sat Sun") do set dow=%%d echo dow is : %ndow% %dow% pause