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\
Это мой текущий сценарий, и я должен менять дату еженедельно. Я ищу сценарий, который будет смотреть на сегодняшнюю текущую дату минус один день и может изменять 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\
Использовать эти инструкции чтобы помочь вам запланировать копию
Выполнение таких действий в командных файлах cmd - чисто мазохистское.
Но на любом другом языке это легко (bash под cygwin, возможно, 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. Если вы выбрали любой другой инструмент для создания сценариев, он также будет иметь некоторую функцию копирования файлов.
Поскольку получение вчерашней даты включает в себя различные границы (месяц, годы, високосные годы), это быстро становится немного сложнее, чем кажется. Приведенный ниже сценарий представляет собой небольшую модификацию эта почта и зависит от языковых настроек вашего компьютера (запустите 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%
Если вы можете использовать powershell, почему бы не сделать это с помощью этой простой строчки:
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, вы должны удвоить% следующим образом:
for /f "delims=" %%a in ('powershell -Command [DateTime]::Now.ToString(\"yyyyMMdd_hhmmss\"^)') do @echo DateTime is: %%a
Важное примечание: символ ^ не следует избегать, чтобы увидеть) как окончательный, так же, как \ делает это "внутри powershell и т. Д. Это мета-символ, который говорит, что следующий символ не должен интерпретироваться.
И если вам нужно datetime внутри переменной в пакете, см. Это:
@ECHO OFF
for /f "delims=" %%a in ('powershell -Command [DateTime]::Now.ToString(\"yyyyMMdd_hhmmss\"^)') do @Set MyVariable=%%a
ECHO %MyVariable%
П.Д .: Есть побочные эффекты при использовании powershell, он меняет размер и шрифт окна CMD (и позволяет им изменяться после выхода), также иногда требуется несколько секунд для запуска такой простой команды.
Если ваш основной скрипт имеет чтобы быть в Windows Shell Script, моим решением было бы получить файл .CMD для создания [небольшого] файла .VBS в% TEMP%, а затем запустить его, используя вызов cscript.exe, завернутый в для / f команда. Фактический VBScript может затем использовать DateDiff. Я использовал эту технику на наших компьютерах с Windows Server 2003, где мы не развернули PowerShell по умолчанию. Если вы работаете на платформе Windows NT6, используйте PowerShell.
for / f "delims =" %% a in ('powershell -Command [DateTime] :: Today.AddDays ^ (- 1 ^). ToString ^ (\ "yyyyMMdd \" ^)') do (set onedayold = %% а)