web-dev-qa-db-ja.com

cmdスクリプトでの日付演算

ファイル名をaDate.txtからbDate.txtに変更するスクリプトを作成する必要があります。ここで:

  • aDateは、yyyymmdd形式の現在のシステム日付であり、
  • bDateは、現在のシステム日付-1(yyyymmdd形式)です。

私は現在持っています:

set yy=%date:~6,2%
set mm=%date:~3,2%
set dd=%date:~0,2%
if "%date:~6,1%"==" " set yy=0%yy:~1,1%
if "%date:~3,1%"==" " set mm=0%mm:~1,1%
if "%date:~0,1%"==" " set dd=0%dd:~1,1%
SET sys_date=20%yy%%mm%%dd%
ECHO %sys_date%
REM still have to do this bit properly
SET sys_date_yesterday=%sys_date%a
move %sys_date%.txt %sys_date_yesterday%.txt

しかし、日付-1のこと(長蛇の列以外)を行う方法がわかりません。日から1を引き、それが= 0の場合、月から1を引き、日=を新しい月の最後の日に設定します。など、何年もの間。

何か案は?

10
Ron Tuffin

あなたはそれを難し​​い方法でやらなければなりません。 SteveGTRによる this ソリューションを使用することをお勧めします。以下のテキストをコピーします。少なくとも、少なくともそのサイトで解決策を常に確認できるとは限らないためです。


これは、現在の日付から任意の日数を差し引くために開発したバッチファイルです。日数のコマンドラインパラメータを受け入れます。デフォルトは1日(昨日)です:

@echo off

set yyyy=

set $tok=1-3
for /f "tokens=1 delims=.:/-, " %%u in ('date /t') do set $d1=%%u
if "%$d1:~0,1%" GTR "9" set $tok=2-4
for /f "tokens=%$tok% delims=.:/-, " %%u in ('date /t') do (
 for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do (
    set %%x=%%u
    set %%y=%%v
    set %%z=%%w
    set $d1=
    set $tok=))

if "%yyyy%"=="" set yyyy=%yy%
if /I %yyyy% LSS 100 set /A yyyy=2000 + 1%yyyy% - 100

set CurDate=%mm%/%dd%/%yyyy%

set dayCnt=%1

if "%dayCnt%"=="" set dayCnt=1

REM Substract your days here
set /A dd=1%dd% - 100 - %dayCnt%
set /A mm=1%mm% - 100

:CHKDAY

if /I %dd% GTR 0 goto DONE

set /A mm=%mm% - 1

if /I %mm% GTR 0 goto ADJUSTDAY

set /A mm=12
set /A yyyy=%yyyy% - 1

:ADJUSTDAY

if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
REM ** Month 12 falls through

:SET31

set /A dd=31 + %dd%

goto CHKDAY

:SET30

set /A dd=30 + %dd%

goto CHKDAY

:LEAPCHK

set /A tt=%yyyy% %% 4

if not %tt%==0 goto SET28

set /A tt=%yyyy% %% 100

if not %tt%==0 goto SET29

set /A tt=%yyyy% %% 400

if %tt%==0 goto SET29

:SET28

set /A dd=28 + %dd%

goto CHKDAY

:SET29

set /A dd=29 + %dd%

goto CHKDAY

:DONE

if /I %mm% LSS 10 set mm=0%mm%
if /I %dd% LSS 10 set dd=0%dd%

echo Date %dayCnt% day(s) before %CurDate% is %mm%/%dd%/%yyyy%

幸運、スティーブ

4
wimh

Windowsバッチスクリプトを使用して、日付から日を簡単に加算または減算します

これは、バッチスクリプトを使用して日付(加算または減算)を計算するために私が思いついた解決策です。必要に応じて変数を設定し、必要に応じてロジックを調整します。これは私のニーズに非常にうまく機能し、ロジックが多すぎることなく、すべて同じ1つのバッチスクリプトに含まれています。

追加するには:このスクリプトを使用して、マイナスを削除することにより、現在の日付に日数を追加することもできます。 (-:DynamicVBSScriptBuildルーチンの以下のバッチスクリプトの記号なので、 this,-%MinusDay%,が表示されている場合は、マイナス記号を削除して、これらの各行で,%MinusDay%,を取得すると、MinusDay=変数値が追加する日数と等しくなります。

重要な注意:99999値で減算する場合、5つの9(MinusDays=)がバッチスクリプトの制限のようです。 。また、999999値を追加する場合、6つの9(MinusDays=)がバッチスクリプトの制限であるようです。

バッチスクリプト

@ECHO ON

::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run
SET MinusDay=2

:: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify
CALL :DynamicVBSScriptBuild

FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS%"') DO SET YYYY=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS%"') DO SET MM=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS%"') DO SET DD=%%A

::// Set your web server log file path in the below variable
SET WebServerLogPath=C:\WebServer\Logs

::// Set web server log file name where YYYY MM DD variables are set to the values after the day numbers setup above are subtracted
SET YYYY=%YYYY%
SET MM=%MM%
SET DD=%DD%

ECHO %YYYY%%MM%%DD%
PAUSE

GOTO EOF

:DynamicVBSScriptBuild
SET YYYYTmpVBS=%temp%\~tmp_yyyy.vbs
SET MMTmpVBS=%temp%\~tmp_mm.vbs
SET DDTmpVBS=%temp%\~tmp_dd.vbs
IF EXIST "%YYYYTmpVBS%" DEL /Q /F "%YYYYTmpVBS%"
IF EXIST "%MMTmpVBS%" DEL /Q /F "%MMTmpVBS%"
IF EXIST "%DDTmpVBS%" DEL /Q /F "%DDTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%YYYYTmpVBS%"
ECHO yyyy = Year(dt)                    >> "%YYYYTmpVBS%"
ECHO WScript.Echo yyyy                  >> "%YYYYTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%MMTmpVBS%"
ECHO mm = Right("0" ^& Month(dt),2)     >> "%MMTmpVBS%"
ECHO WScript.Echo mm                    >> "%MMTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%DDTmpVBS%"
ECHO dd = Right("0" ^& Day(dt),2)       >> "%DDTmpVBS%"
ECHO WScript.Echo dd                    >> "%DDTmpVBS%"
GOTO EOF

その他のリソース

うるう年などを確認しながら、現在の日付から日数を引くものが必要でしたが、これはうまくいきました。

必要なパラメーター(減算する日数)を使用してこれらのスクリプトから呼び出し、置換を使用して呼び出し元のスクリプトをコールバックし、変更された(減算された)日付のパラメーターを元のスクリプトに戻します。

次に例を示します。

日付計算変数セットを必要とするスクリプト:

IF "%1"=="" goto modifydate

:modifydate
SET subtractdays=5
SET ModDateScript=\\servershare\path\Called_Scripts\ModDate.cmd
CALL "%ModDateScript%" %subtractdays% "%~fnx0"

%moddate%パラメータを計算して元の呼び出しスクリプトに返し、それに応じて処理するための変数として設定するスクリプト。これを呼び出すスクリプトの最後に置くだけで、現在の日付(ModDate.cmd)から日数を変更/減算できます。

SET moddate=%mm%/%dd%/%yyyy%
Call %2 %moddate%
GOTO EOF

私は、投稿された元のスクリプトからのこれらの行をテストして決定することができました:

set yyyy=
set $tok=1-3
for /f "tokens=1 delims=.:/-, " %%u in ('date /t') do set $d1=%%u
if "%$d1:~0,1%" GTR "9" set $tok=2-4
for /f "tokens=%$tok% delims=.:/-, " %%u in ('date /t') do (
for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do (
    set %%x=%%u
    set %%y=%%v
    set %%z=%%w
    set $d1=
    set $tok=))
if "%yyyy%"=="" set yyyy=%yy%
if /I %yyyy% LSS 100 set /A yyyy=2000 + 1%yyyy% - 100

この1行だけで置き換えることができ、同様に機能します。

FOR /F "tokens=2-4 delims=/ " %%A IN ("%date%") DO SET "mm=%%A" DO (& SET "dd=%%B") DO (& SET "yyyy=%%C")

テストでは違いがすぐにわからないので、とにかくそれらの行(私が1行に変更した行とステートメント)が何をするのか説明してください。私は19世紀に引き算しました、そしてそれは私には正確に見えました。修正された年が2000未満になる計算を処理するのに役立つと思いましたが、何かが足りない場合を除いて、それはわかりませんでした。

それ以外の場合は、この1つのスクリプトを簡単に呼び出して、独自の計算が必要な複数のスクリプトのパラメーターとして%mm%/%dd%/%yyyy%を返すことができます。優れた非常に効率的なバッチソリューション。引数を%1、%2、%3などとして渡しても、そのスクリプトで現在の日付のsetlocalを使用できます。変数をmoddate =%1などにするだけです。

最後に、バッチスクリプトの専門家に、このスクリプトをさらに最適化して、バッチ担当者がテストできるように結果を投稿するように依頼します。

ありがとう、P

1
Batch Scripter

言い換えれば、このコードを試してみてください。スクリプトサブルーチンとして使用するか、これをCALLおよびパラメーター関数とともに使用して、元のバッチファイルに戻すことができます。

:: Pass 1st parameter as number of days (whole numbers) to subtract from current day in   date
:: This script is able to subtract days to any date of the current date
:: This script will check for leap years, etc. as well
@echo on
::for /f "tokens=2-4 delims=/ " %%A in ("%date%") do set "mm=%%A" do & set "dd=%%B" do & set "yyyy=%%C"
set "mm=%date:~4,2%" & set "dd=%date:~7,2%" & set "yyyy=%date:~10,4%"
set CurDate=%mm%/%dd%/%yyyy%
set dayCnt=%1
if "%dayCnt%"=="" set dayCnt=1
:: Substract your days here
set /A dd=1%dd% - 100 - %dayCnt%
set /A mm=1%mm% - 100
:CHKDAY
if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1
:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
:: ** Month 12 falls through
:SET31
set /A dd=31 + %dd%
goto CHKDAY
:SET30
set /A dd=30 + %dd%
goto CHKDAY
:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29
:SET28
set /A dd=28 + %dd%
goto CHKDAY
:SET29
set /A dd=29 + %dd%
goto CHKDAY
:DONE
if /I %mm% LSS 10 set mm=0%mm%
if /I %dd% LSS 10 set dd=0%dd%
echo Date %dayCnt% day(s) before %CurDate% is %mm%/%dd%/%yyyy%
SET DirDate=%mm%/%dd%/%yyyy%
:: The %2 parameter is passed from the calling script as the full path and name of the          file to call back
:: %2 equals %~fnx0
:: The dirdate variable is passed as parameter %1 back to the calling script
Call %2 %dirdate%
GOTO EOF

日付を動的に計算するために、バッチから組み込むか呼び出すことができるvbまたはより効率的なものを探します。

1
Batch Scripter