Назад | Перейти на главную страницу

Как создать вчерашнюю дату в пакете

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 = %% а)