Identificar padrão no nome do arquivo usando lote

1

Eu tenho um script que renomeia arquivos adicionando um timestamp como um prefixo para o nome do arquivo atual. Um arquivo com timestamp é assim:

20170407_1030.file1.txt

Eu corro este script em uma pasta depois de ter trabalhado com alguns arquivos. O problema é que, uma vez que um arquivo já tenha um timestamp prefixado ao seu nome, na próxima vez que eu executar o script, ele pré-anexará outro timestamp ao nome do arquivo. Em vez disso, se um arquivo já tiver um timestamp em seu nome, quero substituí-lo por um registro de data e hora atualizado.

Para isso, estou tentando identificar nomes de arquivos que já contêm um registro de data e hora e, em caso afirmativo, substituí-lo por um registro de data e hora atualizado.

Meu script para fazer isso atualmente é assim:

setlocal enabledelayedexpansion

for /f "delims=|" %%F in ('dir /b %cd%\*.*') do (
  set "MDate=%%~tF"
  set "Patern=*_*."
  set "TimeStamp=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
  ren "%%~nF%%~xF" "!TimeStamp!-%%~nF%%~xF" 
)
exit

Editar: desculpe por não fornecer mais detalhes. Eu tenho feito algumas pesquisas e não consigo encontrar uma maneira de combinar máscaras no exemplo dado. Eu sei como substituir padrões predefinidos ou como combinar máscaras como ren *.png *.jpg .

    
por hailbreno 04.07.2017 / 16:28

1 resposta

2
@Echo off
Pushd "X:\path\to\workdir"

:: Get current date time 
For /f "delims=." %%A in (
  'wmic os get LocalDateTime^|findstr ^^[0-9]'
) do Set DT=%%A
Set "DT=%DT:~0,8%_%DT:~8,4%"

For /f "tokens=1* delims=." %%A in (
  'Dir /B/A-D "20*_*.*.txt"^|findstr "^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\." '
) do Echo ren "%%A.%%B" "%DT%.%%B"

Se a saída parece OK, remova o eco na última linha.

Exemplo de saída:

> SU_1225592.cmd
ren "20170704_1656.File1.txt" "20170704_1700.File1.txt"
ren "20170704_1656.File2.txt" "20170704_1700.File2.txt"

Editar Para verificar apenas um arquivo para a existência de um padrão date_time
você pode usar esse lote que usa apenas o errorlevel retornado pela findstr
para executar condicionalmente no sucesso && ou falha || comandos diferentes.

@Echo off
Set "Pattern=^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\."
For %%A in ("%CD%\*") Do Echo:%%~nA|findstr "%Pattern%">NUL 2>&1 && (
    Echo found Pattern in %%~fA
) || (
    Echo No    Pattern in %%~fA
)

Exemplo de saída:

No    Pattern in A:\Copy+Archive.cmd
No    Pattern in A:\SU_1225592.cmd
found Pattern in A:170704_1656.File1.txt
found Pattern in A:170704_1656.File2.txt
No    Pattern in A:\tp010387.BAT
    
por 04.07.2017 / 17:05