Cómo usar nircmd.exe y configurar el nombre de archivo %~nF en un bucle for por lotes

Cómo usar nircmd.exe y configurar el nombre de archivo %~nF en un bucle for por lotes

Estoy intentando escribir un archivo por lotes que recorra cada nombre de archivo, tome parte de las cadenas y establezca las fechas de creación y modificación. Eso sí, dirpath es un marcador de posición para la ruta 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")

No estoy seguro de cómo solucionar el problema de lo que hace el script: la pausa no detiene el programa después del ciclo. ¿Cómo se puede reescribir esto para que funcione?

Respuesta1

¿Cómo se puede reescribir esto para que funcione?

Tiene varios problemas con su archivo por lotes:

  • Que no es %f. Necesitas usarlo %%fen su lugar. %fes para una línea de comando, que necesita ser arreglada en al menos 3 lugares.
  • Pondría los comandos dentro de do ( ... )líneas separadas.
  • Puedes poner una pausa antes del cierre.)
  • Puede comentar la primera línea con rempara ver qué está haciendo el archivo por lotes.
  • Agregue echoa la línea de carga útil con nircmd.
  • Retire el echocuando crea que está funcionando.
  • En algunos lugares necesita usarlo !en lugar de %dentro del forbucle (para eso enabledelayedexpansiones: permite expandir las variables en el momento de la ejecución en lugar de en el momento del análisis).

Comience con el siguiente archivo por lotes (he solucionado los errores principales):

@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

Otras lecturas

  • Un índice AZ de la línea de comando CMD de Windows- Una excelente referencia para todo lo relacionado con la línea cmd de Windows.
  • expansión retrasada habilitada- La expansión retrasada hará que las variables se expandan en el momento de la ejecución en lugar de en el momento del análisis.
  • para /r- Recorrer archivos (subcarpetas recursivas).
  • colocar- Mostrar, configurar o eliminar variables de entorno CMD. Los cambios realizados con SET permanecerán solo durante la sesión CMD actual.
  • establecer local- Establecer opciones para controlar la visibilidad de las variables de entorno en un archivo por lotes.

Respuesta2

Encontré otra solución simplemente llamando a una función.

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

Gracias a todos por toda su ayuda.

información relacionada