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にあります
苦痛の世界を救い、より良い言語を使用してください!
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\
これらの手順 を使用して、コピーのスケジュールを設定します
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ウィンドウのサイズとフォントが変更され(終了後に変更されます)、このような単純なコマンドの実行に数秒かかる場合もあります。
昨日の日付の取得にはさまざまな境界(月、年、うるう年)が含まれるため、予想よりも少し複雑になります。以下のスクリプトは この投稿 のわずかな変更であり、マシンの言語設定に依存します(コマンドラインで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%
このようなことを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モジュールを使用します。他のスクリプトツールを選択した場合は、ファイルコピー機能もいくつかあります。
あなたのメインスクリプト 持っている Windowsシェルスクリプトにするための私の解決策は、.CMDファイルを取得して%TEMP%に[小さい] .VBSファイルを作成し、次の呼び出しを使用して起動することです。 cscript.exeに包まれた / f コマンド。その後、実際のVBScriptは DateDiff。私はこの手法をWindows Server 2003ボックスで使用しましたが、既定ではPowerShellを展開していません。 Windows NT6プラットフォームを使用している場合は、PowerShellを使用します。