web-dev-qa-db-ja.com

昨日の日付をバッチで作成する方法

copy \\server01\E$\LogFiles\IVR\bcR\??120428.* \\LBC\workgroup\cs\ftp\Team\bcR\
copy \\server02\E$\LogFiles\IVR\bcR\??120428.* \\LBC\workgroup\cs\ftp\Team\bcR\
copy \\server03\E$\LogFiles\IVR\bcR\??120428.* \\LBC\workgroup\cs\ftp\Team\bcR\
copy \\server04\E$\LogFiles\IVR\bcR\??120428.* \\LBC\workgroup\cs\ftp\Team\bcR\

これは私の現在のスクリプトで、日付を毎週変更する必要があります。今日の現在の日付から1日を引いた日付を調べ、12 04 28を変更できるスクリプトを探しています(年月日のサンプル120408)。昨日の日付が必要です。このスクリプトはDOSにあります

3
Joe

苦痛の世界を救い、より良い言語を使用してください!

PowerShellに必要なスクリプトは次のとおりです。

$yesterday = [DateTime]::Today.AddDays(-1).ToString("yyMMdd")
copy \\server01\E$\LogFiles\IVR\bcR\??${yesterday}.* \\LBC\workgroup\cs\ftp\Team\bcR\
copy \\server02\E$\LogFiles\IVR\bcR\??${yesterday}.* \\LBC\workgroup\cs\ftp\Team\bcR\
copy \\server03\E$\LogFiles\IVR\bcR\??${yesterday}.* \\LBC\workgroup\cs\ftp\Team\bcR\
copy \\server04\E$\LogFiles\IVR\bcR\??${yesterday}.* \\LBC\workgroup\cs\ftp\Team\bcR\

これらの手順 を使用して、コピーのスケジュールを設定します

4
dwurf

Powershellを使用できる場合は、次の簡単な1行で実行してみませんか。

powershell -Command [DateTime]::Now.ToString(\"yyyyMMdd_hhmmss\")

実際の年、月、日、時、分、秒を出力する例です。

最後の部分を参照してください。これは必要な形式なので、必要な形式で取得できます。

それが何をするかの説明:

  • .ToString(...)では、[DateTime]::Nowの出力をyyyyMMdd_hhmmssの形式でフォーマットします

そして、それをbacthファイルに入れたい場合は、for /f "delims="のトリックを使用できます。例を参照してください。

for /f "delims=" %a in ('powershell -Command [DateTime]::Now.ToString(\"yyyyMMdd_hhmmss\"^)') do @echo DateTime is: %a

.BATまたは.CMDファイル内で使用する場合は、次のように%を2倍にする必要があります。

for /f "delims=" %%a in ('powershell -Command [DateTime]::Now.ToString(\"yyyyMMdd_hhmmss\"^)') do @echo DateTime is: %%a

重要な注意:^文字は、)が最後に表示されるので避けてください。Powershell内で\がこれを実行するのと同じです。

バッチの変数内に日時が必要な場合は、これを参照してください:

@ECHO OFF
for /f "delims=" %%a in ('powershell -Command [DateTime]::Now.ToString(\"yyyyMMdd_hhmmss\"^)') do @Set MyVariable=%%a
ECHO %MyVariable%

P.D .: powershellの使用には副作用があり、CMDウィンドウのサイズとフォントが変更され(終了後に変更されます)、このような単純なコマンドの実行に数秒かかる場合もあります。

1
anonymous

昨日の日付の取得にはさまざまな境界(月、年、うるう年)が含まれるため、予想よりも少し複雑になります。以下のスクリプトは この投稿 のわずかな変更であり、マシンの言語設定に依存します(コマンドラインでDATE /Tを実行します)。

@echo off

for /f "tokens=1" %%i in ('date /t') do set thedate=%%i

set yy=%thedate:~2,2%
set mm=%thedate:~5,2%
set dd=%thedate:~8,2%
echo Today    : %yy%%mm%%dd%

if %dd%==08 (
set dd=8 ) else (
if %dd%==09 (
set dd=9 ) )

if %mm%==08 (
set mm=8 ) else (
if %mm%==09 (
set mm=9 ) )

set /A dd=%dd% - 1
set /A mm=%mm% + 0

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 yy=%yy% - 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
if %mm%==12 goto SET31

goto ERROR

:SET31
set /A dd=31 + %dd%
goto DONE

:SET30
set /A dd=30 + %dd%
goto DONE

:LEAPCHK
set /A tt=%yy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yy% %% 400
if %tt%==0 goto SET29

:SET28
set /A dd=28 + %dd%
goto DONE

:SET29
set /A dd=29 + %dd%

:DONE
if /i %dd% LSS 10 set dd=0%dd%
if /I %mm% LSS 10 set mm=0%mm%
set YESTERDAY=%yy%%mm%%dd%
echo Yesterday: %YESTERDAY%
1
erikxiv

このようなことをcmdバッチファイルで行うことは、純粋に自発的です。

しかし、他の言語ではそれは簡単です(cygwinでbash、おそらくpowershell。vbscriptでもこれがかなり簡単になるかもしれません)。

したがって、他のスクリプト言語を使用して、すべてを実行するか、一時バッチファイルを書き出して実行します。

Perlの例:

#!/usr/bin/Perl

use strict;
use Date::Format;

my $date = time2str("%y%m%d", time-86400);

for ( qw(01 02 03 04) ) {
    print "copy \\\\server$_\\E\$\\LogFiles\\IVR\\bcR\\??$date.* \\\\LBC\\workgroup\\cs\\ftp\\Team\\bcR\\", "\n";
}

それがwritebatch.plと呼ばれているとしましょう。次に、スクリプトは次のようになります

Perl writebatch.pl > "%TEMP%\dailycopies.cmd"
call "%TEMP%\dailycopies.cmd"

または、スクリプトから直接コピーを実行することもできます。 Perlでは、File :: Copyモジュールを使用します。他のスクリプトツールを選択した場合は、ファイルコピー機能もいくつかあります。

1
mivk

あなたのメインスクリプト 持っている Windowsシェルスクリプトにするための私の解決策は、.CMDファイルを取得して%TEMP%に[小さい] .VBSファイルを作成し、次の呼び出しを使用して起動することです。 cscript.exeに包まれた / f コマンド。その後、実際のVBScriptは DateDiff。私はこの手法をWindows Server 2003ボックスで使用しましたが、既定ではPowerShellを展開していません。 Windows NT6プラットフォームを使用している場合は、PowerShellを使用します。

0
Simon Catlin