在batch file中查找星期几? (Windows Server 2008)

我有一个从batch file运行的进程,我只想在一周中的某一天运行它。
是否有可能获得星期几?

我发现的所有例子都依赖于“date / t”来返回“2009年11月12日星期五”,但是在我的机器中,“date / t”返回“12/11/2009”。 那里没有工作日。

我已经检查了我的机器的“区域设置”,长date格式包括星期几。 短date格式不,但我真的不想改变,因为它会影响我做的一堆东西。

我对这个派对有点迟到,但这会给你一个星期的一天:

wmicpathwin32_localtime得到dayofweek

使用一个批处理循环来获取输出,并且你有一个星期几的可testing条件。

批量不能轻松做到这一点。 用date命令需要很多命令行fu。 有几种方法可以实现您的目标,但最重要的是我想知道为什么内置的Task Scheduler不是一个选项? 它允许您指定要运行的date和时间:

替代文字http://i46.tinypic.com/140jm6o.png

你也可以使用VBScript:

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

然后运行它:

  C:\ Documents and Settings \ Administrator> cscript / nologo dayofweek.vbs
星期三 

您可以很容易地使用VBScript中的if / else逻辑,然后让您的VBScript代码根据当天执行batch file,反之亦然(批量调用VBScript)。

这里有一个batch file,它将把所有的date和时间信息存入variables,但是它取决于你在你的机器上设置了合适的date格式。 此外,订单可能需要根据当地date格式进行调整,我不确定。

 @echo off for /F "tokens=1-4 delims=/ " %%i in ('date /t') do ( set WD=%%i set D=%%j set M=%%k set Y=%%l ) for /F "tokens=1-4 delims=: " %%i in ('time /t') do ( set H=%%i set Mn=%%j set AP=%%k ) if "%AP%"=="PM" set /AH=%H%+12 echo %WD% %D%/%M%/%Y% - %H%:%Mn% 

你想要的位是%WD%。

我可以引用一些我在网上find的东西:

关于DOW问题…

Win 2000通过星期几标题显示当前date,但Win XP在没有DOW的情况下为您提供了您的国家格式的裸号。 这是影响两个(几乎)操作系统的兄弟的小事件之一。

要解决这个问题,就是强制(模拟)DOS显示的传统格式

 Echo.|Command /C Date|Find "current" 

这真的起作用了,现在你只需要从输出string中摸索出DOW,就完成了…

其实这个标志(2K8,2K3,XP等)是短date格式。

在区域和语言选项下 – 单击自定义button在date选项卡上将短date格式更改为“M / d / yyyy”将LONGdate格式更改为“dddd,MMMM dd,yyyy”

然后星期几出现 – testing这个在dos提示符下执行:date / t输出应该是这样的“星期一01/31/2011”

Incase任何人都需要它,这适用于我在Windows 7和XP …

 echo.|command /C date|find /i "current" >%temp%\dow.txt for /f "tokens=1-4 delims=/ " %%i in (%temp%\dow.txt) do set DOW=%%l echo %DOW% 

对于Windows Server 2008,我会使用上面build议的Powershell方法之一。

为了避免必须redirect到文本文件,FOR有一个变体,它接受一个命令string。 这里是:

@For / F“tokens = 4 delims = / – ”%i In('@Echo.^|Command / C Date ^ | Find / i“current”')@Echo%i

请记住,如果将此命令放在dos脚本中,则使用双重百分号。 在我的例子中,我检查了正斜杠或短划线的通用date分隔符。

我更喜欢这个解决scheme,因为它完全是DOS,而不必依赖于是否存在WMI,PowerShell等。

对于Windows 2008来说,这个更优雅。 也可以在任何地方安装PowerShell。

 @for /F "tokens=1 delims=, " %%i In ('powershell date') do set dow=%%i echo %dow% 

感谢Phil Swiss之前的发帖 – 这个作品是一种享受:

echo. | cmd /C date | find "current"

示例用法:

echo. | cmd /C date | find /i "Fri" && echo today is Friday

或者扭转:

echo. | cmd /C date | find /i "Fri" || echo today is NOT Friday

 @echo off :set the variables for /f %%C in ('wmic path Win32_LocalTime Get Year^,Month^,Day^,Hour^,Minute^,Second /Format:List 2^>nul ^| find "="') do @set current%%C :display the variables set current 

现在剩下的就是如果其中的任何一个都小于10,就预先将零置于date和月份。

以下是现代系统上BAT脚本的正确答案:

 @echo off for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i echo %dow% 

输出:

 Saturday 

用法:

 @echo off for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i if %dow% == Saturday goto shutdown if %dow% == Sunday goto shutdown exit :shutdown shutdown /s /f /t 90 

我用这个用于每天从BIOS自动启动的PC,它没有排除周末的选项。

除此之外:ACPI是一种更可靠的方式,可以使用“ 唤醒计算机运行此任务”选项,在选定特定date的Windows计划任务中使用exit等虚拟BAT脚本。

这可以通过简单的计算来完成

  ::get dow number (1=monday) from dd mm yy set/aa=(14-mm)/12,yr=yy-a,m=mm+12*a-2,"dow=(dd+yr+yr/4-yr/100+yr/400+31*m/12)%%7" 

我在美国。 我可以在Windows 7,Windows 2008 R2,Windows Server 2003,Windows XP中运行此代码(所有操作系统都是最新的Windows更新和修补程序)。 所有的短date设置没有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”。

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

 ECHO: I needed a more comprehensive solution using an array. @ECHO OFF setlocal EnableDelayedExpansion ECHO :: Get DayOfWeek ECHO :: Will return DayOfWeek=# ECHO :: For /F "tokens=1 delims=| " %%a In ( 'wmic path win32_localtime get dayofweek /Value^|Find "DayOfWeek"' ) Do ( Echo %%a set "str=%%a" ECHO :: Remove DayOfWeek= set "str=!str:~10,1!" ECHO !str! ) ECHO. ECHO :: Create vector with names of days (Index of Days) for %%d in (Monday Tuesday Wednesday Thrusday Friday Saturday Sunday) do ( set /A i=i+1 set day[!i!]=%%d if !i!==!str! ( ECHO :: If today what DayOfWeek is it? ECHO %%d ) ) ECHO :: ECHO. ECHO :: This is how we get the value outside the loop set index=!str! echo(!day[%index%]! ECHO. PAUSE 

好的,find答案
我找不到使用普通BAT文件的方法,但是如果您有权访问PowerShell …

 @echo off powershell date > date.txt find/i "Fri" date.txt > nul if errorlevel 1 goto SkipWeeklyTasks Do your weekly stuff here :SkipWeeklyTasks del date.txt 

希望它有帮助…

编辑:(对于潜在的人在这个绊脚石)这是讨厌和丑陋的,不应该做的,如果这个问题适用于你,这个问题的其他答案更好。 如果你需要在一个已经有的batch file中快速完成这个操作,那么这可能对你有用。

丹尼尔

我用…

 for /f %i in ('cmd /c wmic path win32_localtime get dayofweek^|findstr [0-9]') do set dayofweek=%i 

…获取当前date编号。

 for /f "skip=1" %%a in ('WMIC Path win32_LocalTime Get DayOfWeek') do if not defined dayNumber set dayNumber=%%a