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

0

Estou tentando gravar um arquivo em lotes que faz iteração em cada nome de arquivo, faz parte das sequências e define as datas criadas e modificadas. Lembre-se, 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 sei 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?

    
por alrightgame 15.10.2015 / 21:19

2 respostas

2

Como isso pode ser reescrito para funcionar?

Você tem vários problemas com seu arquivo em lotes:

  • Não é %f . Você precisa usar %%f . %f é para uma linha de comando, que precisa ser corrigida em pelo menos três locais.
  • Eu colocaria os comandos dentro do do ( ... ) em linhas separadas.
  • Você pode colocar uma pausa antes do fechamento )
  • Você pode comentar a primeira linha com rem para ver o que o arquivo em lote está fazendo.
  • Adicione echo à linha de carga útil com nircmd .
  • Remova o echo quando achar que está funcionando.
  • Em alguns lugares, é necessário usar ! em vez de % dentro do for loop (é para isso queenabledelayedexpansion serve - ele permite que as variáveis sejam expandidas em tempo de execução e não 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 A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
  • enabledelayedexpansion - Expansão com atraso fará com que as variáveis sejam expandidas em tempo de execução e não no tempo de análise.
  • para / r - Fazer um loop pelos arquivos (criar subpastas).
  • definir - Exibir, definir ou remover variáveis de ambiente do CMD. As alterações feitas com o SET permanecerão apenas pela duração da sessão atual do CMD.
  • setlocal - Defina opções para controlar a visibilidade de variáveis de ambiente em um arquivo em lotes.
por 15.10.2015 / 21:39
1

Eu 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 pela sua ajuda.

    
por 15.10.2015 / 23:17

Tags