
Estou tentando escrever um arquivo em lote que percorre cada nome de arquivo, faz parte das strings e define as datas de criação e modificação. Veja bem, dirpath é um espaço reservado para o caminho real.
@echo off
setlocal enabledelayedexpansion
FOR /R dirpath %F in (*.*) DO (SET FNAME=%~nF SET MM=%FNAME:~0,2% SET DD=%FNAME:~2,2% SET YY=%FNAME:~4,2% nircmd.exe setfiletime %F "%DD% %MM%-20%YY% 00:00:00" "%DD%-%MM%-20%YY% 00:00:00")
Não tenho certeza de como solucionar o que o script está fazendo - a pausa não pausa o programa após o loop. Como isso pode ser reescrito para funcionar?
Responder1
Como isso pode ser reescrito para funcionar?
Você tem vários problemas com seu arquivo em lote:
- Não é
%f
. Você precisa usar%%f
em vez disso.%f
é para uma linha de comando que precisa ser corrigida em pelo menos 3 lugares. - Eu colocaria os comandos dentro de
do ( ... )
linhas separadas. - Você pode colocar uma pausa antes do fechamento
)
- Você pode comentar a primeira linha para
rem
ver o que o arquivo em lote está fazendo. - Adicione
echo
à linha de carga útil comnircmd
. - Remova o
echo
quando achar que está funcionando. - Você precisa em alguns lugares usar
!
em vez de%
dentro dofor
loop (é para isso queenabledelayedexpansion
serve - ele permite que as variáveis sejam expandidas em tempo de execução em vez de em tempo de análise
Comece com o seguinte arquivo em lote (corrigi os principais erros para você):
@echo off
setlocal enabledelayedexpansion
for /r dirpath %%F in (*.*) DO (
set FNAME=%%~nF
SET MM=!FNAME:~0,2!
SET DD=!FNAME:~2,2!
SET YY=!FNAME:~4,2!
echo nircmd.exe setfiletime %%F "!DD!-!MM!-20!YY! 00:00:00" "!DD!-!MM!-20!YY! 00:00:00"
pause
)
endlocal
Leitura adicional
- Um índice AZ da linha de comando do Windows CMD- Uma excelente referência para todas as coisas relacionadas à linha cmd do Windows.
- habilitadodelayedexpansion- A expansão atrasada fará com que as variáveis sejam expandidas no tempo de execução, e não no tempo de análise.
- para /r- Loop através de arquivos (subpastas Recurse).
- definir- Exibir, definir ou remover variáveis de ambiente CMD. As alterações feitas com SET permanecerão apenas durante a sessão CMD atual.
- definirlocal- Defina opções para controlar a visibilidade das variáveis de ambiente em um arquivo em lote.
Responder2
Encontrei outra solução simplesmente chamando uma função.
FOR /R dirname %%F in (*.*) DO call :Setfiletime %%F
goto End
:Setfiletime
SET FNAME=%~n1
echo %FNAME%
SET MM=%FNAME:~0,2%
SET DD=%FNAME:~2,2%
SET YY=%FNAME:~4,2%
nircmd.exe setfiletime %1 "%DD%-%MM%-20%YY%" "%DD%-%MM%-20%YY%"
:goto :eof
:End
Obrigado a todos por sua ajuda.