Como criar uma data de ontem em um lote

3
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\

Este é o meu script atual e eu tenho que mudar a data semanalmente. Eu estou procurando um script que vai olhar para a data atual de hoje menos um dia e pode modificar o 12 04 28. (Year Month Day amostra 120408). Eu preciso da data de ontem. Este script está no DOS

    
por Joe 30.04.2012 / 23:16

6 respostas

4

Economize um mundo de dor, use uma linguagem melhor!

Aqui está o script que você deseja no 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\

Use estas instruções para ajudá-lo a agendar a cópia

    
por 01.05.2012 / 00:19
1

Como recuperar a data de ontem envolve vários limites (mês, anos, anos bissextos), ela rapidamente se torna um pouco mais complexa do que se pensa. O script abaixo é uma pequena modificação de este post e depende das configurações de idioma de suas máquinas (execute DATE /T em sua linha de comando).

@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%
    
por 30.04.2012 / 23:52
1

Fazer esse tipo de coisa em arquivos em lote cmd é puramente masoquista.

Mas em qualquer outra linguagem é fácil (bash sob cygwin, provavelmente powershell; mesmo vbscript pode tornar isso razoavelmente fácil).

Portanto, basta usar qualquer outra linguagem de script para fazer tudo ou para gravar um arquivo de lote temporário e executá-lo.

Um exemplo em 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";
}

Digamos que seja chamado de writebatch.pl. Então o seu script pode ser algo como

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

Ou você pode fazer as cópias diretamente do script. Em Perl, você usaria o módulo File :: Copy. Se você escolher qualquer outra ferramenta de script, ela também terá alguma função de cópia de arquivo.

    
por 01.05.2012 / 00:22
1

Se você pode usar o powershell, por que não fazê-lo com esta simples linha:

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

É um exemplo que mostra o ano, mês, dia, hora, minuto e segundo reais.

Veja a última parte, é o formato que você quer, então você pode obtê-lo com o formato que você deseja.

Explicação do que faz:

  • Com .ToString( ... ) , formata a saída de [DateTime]::Now no formato yyyyMMdd_hhmmss

E se você quiser em um arquivo bacth você pode usar o truque de for /f "delims=" , veja um exemplo:

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

Se você quiser usá-lo em um arquivo .BAT ou .CMD, você deve dobrar o% como este:

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

Importar nota: O caractere ^ é ev ev para ver o) como final, mesmo que \ faz isso dentro do powershell, etc. É um meta-caractere que informa ao próximo caractere que não deve ser interpretado.

E se você precisar de datetime dentro de uma variável em um lote, veja isto:

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

P.D .: Há efeitos colaterais no uso do PowerShell, ele altera o tamanho e a fonte da janela do CMD (e os deixa alterados após a saída), também às vezes leva alguns segundos para executar um comando tão simples.

    
por 30.07.2015 / 13:44
0

Se o script principal tiver para estar no Windows Shell Script, minha solução para isso seria obter o arquivo .CMD para criar um [pequeno] arquivo .VBS em% TEMP% e, em seguida, iniciar usando uma chamada para cscript.exe , agrupada em um comando para / f . O VBScript real pode então usar DateDiff . Eu usei essa técnica em nossas caixas do Windows Server 2003, onde não implantamos o PowerShell por padrão. Se você estiver em uma plataforma Windows NT6, use o PowerShell.

    
por 31.07.2012 / 23:28
-1

para / f "delims=" %% a em ('powershell -Command [DateTime] :: Today.AddDays ^ (- 1 ^). ToString ^ (\ "yyyyMMdd \" ^)') do (  set onedayold = %% a  )

    
por 04.12.2018 / 17:38