Como usar nircmd.exe e definir o nome do arquivo% ~ nF em lote para loop

Como usar nircmd.exe e definir o nome do arquivo% ~ nF em lote para loop

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 %%fem 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 remver o que o arquivo em lote está fazendo.
  • Adicione echoà linha de carga útil com nircmd.
  • Remova o echoquando achar que está funcionando.
  • Você precisa em alguns lugares usar !em vez de %dentro do forloop (é para isso que enabledelayedexpansionserve - 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.

informação relacionada