バッチファイルから実行するプロセスがあり、特定の曜日にのみ実行したい。
曜日を取得することは可能ですか?
私が見つけたすべての例は、どういうわけか "date/t"を使用して "Friday、12/11/2009"を返しますが、私のマシンでは、 "date/t"は "12/11/2009"を返します。平日はありません。
私はすでに自分のマシンの「地域設定」を確認しましたが、長い日付形式には平日が含まれています。短い日付形式は変更しませんが、実際には変更しません。これは、私が実行する多くの要素に影響するためです。
私はこのパーティーに少し遅れますが、これはあなたに曜日を与えます:
wmicパスwin32_localtime get dayofweek
バッチのforループを使用して出力を取得すると、曜日のテスト可能な状態になります。
ロブ
これは、すべての日時情報を変数に取得するバッチファイルですが、マシンに適切な日付形式が設定されているかどうかに依存します。また、ローカルの日付形式によっては順序を調整する必要があるかもしれませんが、よくわかりません。
@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 /A H=%H%+12
echo %WD% %D%/%M%/%Y% - %H%:%Mn%
必要なビットは%WD%にあります。
Batchはこれを簡単に行うことができません。 dateコマンドを使用するには、多くのコマンドラインfuが必要です。目的を達成する方法はいくつかありますが、何よりも、組み込みのタスクスケジューラが選択肢にないのはなぜでしょうか。実行する日と時間を指定できます。
VBScriptを使用することもできます。
wscript.stdout.writeline weekdayname(weekday(date))
次にそれを実行します:
C:\ Documents and Settings\Administrator> cscript/nologo dayofweek.vbs 水曜日
VBScriptでif/elseロジックを簡単に使用して、VBScriptコードに日によってバッチファイルを実行させることができます(その逆も可能)(バッチでVBScriptを呼び出します)。
最新のシステムでの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はこれを行うためのより信頼性の高い方法であり、exit
などのダミーのBATスクリプトをコンピューターを起動してこのタスクを実行するオプション。
@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未満の場合は、日と月の前にゼロを付加するだけです。
私の回答はRobWの回答に基づいていますが、彼は単純に平日を反映していますが、質問は、平日に応じてスクリプトのコースを変更する方法です(まさに私もやりたかったことです)。まあ、FOR
ループが処理する行を1つではなく2つ取得し、2番目の行(空のように見える)がスクリプトの実行を中断するため、思ったよりも単純ではないことがわかりました。
実行を中断することなく実際に機能した唯一のFOR
ループは次のとおりです。
for /F "skip=1" %%I in ('wmic path win32_localtime get dayofweek') do (set /a dow=%%I 2>NUL)
if %dow% geq 6 goto ok
echo You can run this script only on Saturday or Sunday
goto :eof
:ok
REM do more stuff here
2>NUL
パートは、2番目の割り当て中に表示されるエラーを抑制しますが、/a
は、リダイレクトのために追加される1つのスペースを扱います。
フィルスイスの以前の投稿のおかげで-これはごちそうになりました:
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
実際には、このフラグ(2K8、2K3、XPなど))はSHORT日付形式です。
[地域と言語のオプション]の下で、[カスタマイズ]ボタンをクリックします。[日付]タブで、短い日付形式を「M/d/yyyy」に変更します。LONG日付形式を「dddd、MMMM dd、yyyy」に変更します。
次に、曜日が表示されます。これをテストするには、これをdosプロンプトで実行します。date/ t出力は、「Mon 01/31/2011」のようになります。
これはWindows 2008の方がはるかにエレガントです。また、powershellがインストールされていればどこでも機能します。
@for /F "tokens=1 delims=, " %%i In ('powershell date') do set dow=%%i
echo %dow%
テキストファイルにリダイレクトする必要をなくすために、コマンド文字列をとるFORのバリエーションがあります。ここにあります:
@For/F "tokens = 4 delims = /-"%i In('@Echo.^|Command/C Date ^ | Find/i "current" ')Do @Echo%i
このコマンドをdosスクリプトに含める場合は、必ず2つのパーセント記号を使用してください。私の例では、スラッシュまたはダッシュの一般的な日付区切り文字をチェックしました。
WMI、PowerShellなどが存在するかどうかに依存する必要がない、DOSのみであるため、このソリューションを選択します。
ネットで見つけたものを引用してもいいですか。
DOW問題について...
Win 2000は曜日を見出しに現在の日付を表示しますが、Win XPはDOWなしで国の形式で最低限の日付を提供します。これは2つに影響を与える小さな問題の1つです(ほとんど)sysyemsを操作する兄弟。
トリックを回避するには、(エミュレートされた)DOSによって表示されるレガシー形式を強制します
Echo.|Command /C Date|Find "current"
これは本当に機能し、出力文字列からDOWをいじくるだけで完了です...
誰かがそれを必要とする場合、これは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の場合は、上記のPowershellメソッドのいずれかを使用します。
簡単な計算でできる
::get dow number (1=monday) from dd mm yy
set/a a=(14-mm)/12,yr=yy-a,m=mm+12*a-2,"dow=(dd+yr+yr/4-yr/100+yr/400+31*m/12)%%7"
Atntoni Gualによって投稿されたソリューションはプレーンバッチで機能しますが、計算を行う前にいくつかの変数を割り当てる必要があります
これは簡単な計算で行うことができます。:: dd mm yy set/aa =(14-mm)/ 12、yr = yy-a、m = mm + 12 * a-2からダウ番号を取得(1 =月曜日)、 "dow =(dd + yr + yr/4-yr/100 + yr/400 + 31 * m/12)%% 7"
:: extract date from date command on OS with date format dd-mm-yyyy
for /F "tokens=1,2,3 delims=-" %%a in ('echo %date%') do (set dd=%%a & set mm=%%b & set yy=%%c)
::get dow number (1=monday) from dd mm yy
set/a a=(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で実行できます(すべてのOSはWindows Updateとパッチで最新です)。すべて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が含まれている長い日付形式になっている可能性もあります。
#USE POWERSHELL:
cls
$Today = (Get-Date).DayOfWeek
$daylabel = $Today | select label,day |
where dayofweek -eq 'friday' |
select -ExpandProperty label
# End of week ( Saturday ) in OLE Automation date format.
$TimeStamp = Get-Date -Format o | foreach {$_ -replace ":", "."}
<#
$TimeStamp
$Today
$daylabel
#>
#Run all your scripts every day but friday
If ($daylabel -eq 'Friday'){
run script |out-file -filepath "filepath\'$timestamp.filename.txt" -Encoding UTF8
}
ELSE {do something else, like 'ECHO "No scripts will be run today."}
If ($daylabel -eq 'Friday','Thursday','Wednesday'){
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
wmic
を使用してこれを正確に行うもう1つの答え
@echo off
set "d1=Mon" & set "d2=Tue" & set "d3=Wed" & set "d4=Thu" & set "d5=Fri" & set "d6=Sat" & set "d7=Sun"
for /f %%i in ('wmic path win32_localtime get dayofweek ^| findstr /r /c:[1-7]') do call echo %%d%%i%%