Windowsバッチファイルの日付を本日から7日前に設定したいと思います。これを次の形式で行いたいと思います。
set today=%date:~10,4%-%date:~4,2%-%date:~-7,2%
ここで7日間の時間デルタをサブプラクティスする方法はありますか?
Windowsバッチファイルの日付を本日から7日前に設定したいと思います。これを次の形式で行いたいと思います。
set today=%date:~10,4%-%date:~4,2%-%date:~-7,2%
ここで7日間の時間デルタをサブプラクティスする方法はありますか?
私はしばらく前にいくつかのサイトに以下の説明を投稿しました:
次のバッチファイルは、日付からユリウス日番号に変換されます。
DATETOJULIAN.BAT:
@ECHO OFF
REM CONVERT DATE TO JULIAN DAY NUMBER
REM ANTONIO PEREZ AYALA
REM GET MONTH, DAY, YEAR VALUES
FOR /F "TOKENS=1-3 DELIMS=/" %%A IN ("%1") DO SET MM=%%A& SET DD=%%B& SET YY=%%C
REM ELIMINATE LEFT ZEROS
SET /A DD=10%DD% %% 100, MM=10%MM% %% 100
REM CALCULATE JULIAN DAY NUMBER
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
JULIANTODATE.BAT:
REM CONVERT JULIAN DAY NUMBER TO MONTH, DAY, YEAR
REM ANTONIO PEREZ AYALA
SET /A W=(%1*100-186721625)/3652425, X=W/4, A=%1+1+W-X, B=A+1524, C=(B*100-12210)/36525, D=36525*C/100, E=(B-D)*10000/306001, F=306001*E/10000, DD=B-D-F, MM=E-1, YY=C-4716
IF %MM% GTR 12 SET /A MM-=12, YY+=1
REM INSERT LEFT ZEROS, IF NEEDED
IF %DD% LSS 10 SET DD=0%DD%
IF %MM% LSS 10 SET MM=0%MM%
REM SHOW THE DATE
ECHO %MM%/%DD%/%YY%
このように、日付に日数を加算/減算するには、次の行を使用します。
CALL DATETOJULIAN %DATE%
SET /A NEWDATE=JDN+DAYS
CALL JULIANTODATE %NEWDATE%
よろしく...
参照: http: //quasar.as.utexas.edu/BillInfo/JulianDatesG.html
MM / DD / YYYYでない場合は、日付形式を調整する必要があります。
AdamEstradaは、日付の減算について質問しました。ジュリアン関数のSETLOCALが原因で、2つのジュリアン日付を減算するのに苦労しました。関数を呼び出して実行しました。
call:sub_Julians!Julian!%Today_Julian%
:sub_Julians
/ a delta_dates =%〜1-%〜2を設定します
..。
goto:eof :: end:age_of_EPSdate
わかりました。DoDオペレーションセンターの現在のJDAYを表示するためのバッチファイルが必要でした。ファイルをダブルクリックすると、CMDウィンドウに表示されます。次に、任意のキーを押して終了します。
これが私が思いついたものです:
@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
:: Call the day ordinal number subroutine
call :JDdayNumber %DD% %MM% %YYYY% DayOrdinalNumber
:: Display the result
echo.
echo Today is JDay %DayOrdinalNumber%
echo.
pause,
endlocal & goto :EOF
:: set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
:: set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
:: echo datestamp: "%datestamp%"
:: echo timestamp: "%timestamp%"
:: echo fullstamp: "%fullstamp%"
:: ============================================================
:: Subroutine: Calculate a day's ordinal number within the year
::JDdayNumber day month year return_
setlocal enableextensions enabledelayedexpansion
if %2 LEQ 2 (
set /a f=%1-1+31*^(%2-1^)
) else (
set /a a=%3
set /a b=!a!/4-!a!/100+!a!/400
set /a c=^(!a!-1^)/4-^(!a!-1^)/100+^(!a!-1^)/400
set /a s=!b!-!c!
set /a f=%1+^(153*^(%2-3^)+2^)/5+58+!s!
)
set /a return_=%f%+1
endlocal & set "%4=%return_%" & goto :EOF
http://www.robvanderwoude.com/datetimentmath.phpJDate
からとGDate
サブルーチンのコードを少しリファクタリングしました。
Enter ISO date:
Enter number of days to add: 7
2017-01-01 + 7 days = 2017-01-08
Enter ISO date:
Enter number of days to add:
2017-01-08 + 7 days = 2017-01-15
Enter ISO date:
Enter number of days to add:
2017-01-15 + 7 days = 2017-01-22
Enter ISO date:
Enter number of days to add:
2017-01-22 + 7 days = 2017-01-29
Enter ISO date:
Enter number of days to add:
2017-01-29 + 7 days = 2017-02-05
Enter ISO date: 2017-02-12
Enter number of days to add: -7
2017-02-12 + -7 days = 2017-02-05
"日付math.bat":
@echo off
call :main %*
goto :eof
:main
setlocal
call :initialize "2017-01-01" "1"
endlocal
goto :eof
:initialize
setlocal
set "previousDate=%~1"
set /a "numberOfDays=%~2"
set /p "previousDate=Enter ISO date: "
set /p "numberOfDays=Enter number of days to add: "
set "currentDate="
call :addIsoDateDays "%previousDate%" "%numberOfDays%" currentDate
echo %previousDate% + %numberOfDays% days = %currentDate%
echo.
call :initialize "%currentDate%" "%numberOfDays%"
endlocal
goto :eof
:stripLeadingZero
setlocal
set "number=%~1"
if %number:~0,1% equ 0 (
set "number=%number:~1%"
)
(
endlocal
set "%~2=%number%"
)
goto :eof
:addLeadingZero
setlocal
set "number=%~1"
if %number% lss 10 (
set "number=0%number%"
)
(
endlocal
set "%~2=%number%"
)
goto :eof
:gregorianToJulianDate
setlocal
set "gregorianYear=%~1"
set "gregorianMonth=%~2"
set "gregorianDay=%~3"
call :stripLeadingZero "%gregorianMonth%" gregorianMonth
call :stripLeadingZero "%gregorianDay%" gregorianDay
set /a "julianYear=(%gregorianYear% + 4800)"
set /a "julianMonth=((%gregorianMonth% - 14) / 12)"
set /a "julianDate=((1461 * (%julianYear% + %julianMonth%) / 4) + (367 * (%gregorianMonth% - 2 - (12 * %julianMonth%)) / 12) - ((3 * ((%julianYear% + %julianMonth% + 100) / 100)) / 4) + (%gregorianDay% - 32075))"
(
endlocal
set "%~4=%julianDate%"
)
goto :eof
:isoToJulianDate
setlocal
set "date=%~1"
set "year="
set "month="
set "day="
for /f "tokens=1-3 delims=-" %%a in ("%date%") do (
set "year=%%a"
set "month=%%b"
set "day=%%c"
)
set /a "julianDate=0"
call :gregorianToJulianDate "%year%" "%month%" "%day%" julianDate
(
endlocal
set "%~2=%julianDate%"
)
goto :eof
:julianToGregorianDate
setlocal
set /a "julianDate=%~1"
set /a "p=(%julianDate% + 68569)"
set /a "q=(4 * %p% / 146097)"
set /a "r=(%p% - ((146097 * %q%) + 3) / 4)"
set /a "s=(4000 * (%r% + 1) / 1461001)"
set /a "t=(%r% - ((1461 * %s%) / 4) + 31)"
set /a "u=(80 * %t% / 2447)"
set /a "v=(%u% / 11)"
set /a "gregorianYear=((100 * (%q% - 49)) + %s% + %v%)"
set /a "gregorianMonth=(%u% + 2 - (12 * %v%))"
set /a "gregorianDay=(%t% - (2447 * %u% / 80))"
call :addLeadingZero "%gregorianMonth%" gregorianMonth
call :addLeadingZero "%gregorianDay%" gregorianDay
(
endlocal
set "%~2=%gregorianYear%"
set "%~3=%gregorianMonth%"
set "%~4=%gregorianDay%"
)
goto :eof
:julianToIsoDate
setlocal
set /a "julianDate=%~1"
set "year="
set "month="
set "day="
call :julianToGregorianDate "%julianDate%" year month day
set "isoDate=%year%-%month%-%day%"
(
endlocal
set "%~2=%isoDate%"
)
goto :eof
:addIsoDateDays
setlocal
set "previousIsoDate=%~1"
set /a "numberOfDays=%~2"
set /a "previousJulianDate=0"
call :isoToJulianDate "%previousIsoDate%" previousJulianDate
set /a "currentJulianDate=(%previousJulianDate% + %numberOfDays%)"
set "currentIsoDate="
call :julianToIsoDate "%currentJulianDate%" currentIsoDate
(
endlocal
set "%~3=%currentIsoDate%"
)
goto :eof
PowerShellを呼び出すことで答えがあります。PowerShellがインストールされていない状態で実行されているマシンはまだありますが(このXPを書いている時点では、Vista、Windows7、Windows2003、およびWindows2008はまだ降下OS共有を持っており、PowerShellがインストールされていない状態で提供されます)
他のオプションは、batスクリプト内でjscriptを使用することです
これは、1つの引数、dayAdder.bat
つまり現在の日付に追加して結果を出力する日のみを受け入れるものです。
@if (@X) == (@Y) @end /* JScript comment
@echo off
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
var days=parseInt(WScript.Arguments.Item(0));
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
var date = new Date();
WScript.Echo(date.addDays(5));
WScript.Echo("Year: " + date.getFullYear());
WScript.Echo("Month: " + date.getMonth());
WScript.Echo("DayOfTeWEek: " + date.getDay());
使用法と出力:
E:\scripts>call dayAdder.bat 7
Sun Nov 8 16:27:48 UTC+0200 2020
Year: 2020
Month: 10
DayOfTeWEek: 2
DayOfTheMonth: 3
自分に合った方法で変更できます。
より簡単なオプションは、バッチスクリプト内からPowerShellコマンドを呼び出して、日付を操作することです。バッチスクリプトでは、1行で日付を過去7日間に設定できます。
powershell -command "((Get-date).AddDays(-7)).ToString('yyyy-MM-dd')">captureVar && set /p Today=<captureVar
この行は、二重引用符で囲まれたコマンドにPowerShellを使用するようにcmd行に指示することから始まります。
powershell -command "the powershell command(s)"
次に、PowerShellコマンドレットGet-Dateを使用し、AddDaysを使用して現在の値から日付を変更します。負の数は減算し、正の数は加算します。デフォルトの形式は次のようになります
Friday, December 20, 2019 6:18:29 PM
フォーマットを変更するには、フォーマットの説明とともに日付を文字列に変更する必要があります
.ToString('dddd MM/dd/yyyy HH:mm:ss.ffff K')
PowerShellコマンドの出力は、captureVarという名前のファイルにリダイレクトされます。もう1つのオプションは、PowerShellにファイルに書き込ませることでした。
powershell -command "((Get-date).AddDays(-7)).ToString('yyyy-MM-dd') | set-content 'captureVar'" && set /p Today=<captureVar
&&を使ってワンライナーにしました。ただし、値がファイルに書き込まれた後はいつでも変数を設定できます。
set /p Today=<captureVar
最も使いやすいスクリプト言語で作成する必要があります。ただし、バッチスクリプトを作成するときのオプションは、バッチコマンドだけではないことに注意してください。Windowsでは、バッチスクリプト内でいつでもPowerShellコマンドを簡単に呼び出すことができます。多くの場合、PowerShellを使用して特定の障害に対する簡単な解決策を見つけ、そのコマンドをスクリプトに挿入してから、通常どおりに続けてバッチスクリプトを完成させることができます。
PowerShellをバッチスクリプトに呼び出すときに覚えておくべきことがいくつかあります。
Batchは、すべてを二重引用符で囲んでPowerShellコマンドと見なします。コマンドで二重引用符を使用するPowerShellで記述されたソリューションを見つけた場合は、それらを一重引用符に置き換える必要があります。文字をエスケープするには、バッチスクリプトのルールに従います。バッチ変数は、PowerShellコマンドでバッチ(%var%)と同じ方法で読み取ることができます。ただし、PowerShellで作成された値は、後でバッチスクリプトで使用できるようにリダイレクトする必要があります。終了引用符がPowerShellセッションを閉じると、PowerShellコマンドで作成された$varはすべて失われます。