Как использовать nircmd.exe и задать имя файла %~nF в пакетном цикле

Как использовать nircmd.exe и задать имя файла %~nF в пакетном цикле

Я пытаюсь написать пакетный файл, который проходит по каждому имени файла, берет часть строк и устанавливает даты создания и изменения. Обратите внимание, dirpath — это заполнитель для фактического пути.

@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")

Я даже не уверен, как устранить неполадки в том, что делает скрипт - pause не останавливает программу после цикла. Как это можно переписать, чтобы работало?

решение1

Как это можно переписать, чтобы работало?

У вас возник ряд проблем с пакетным файлом:

  • Это не %f. %%fВместо этого вам нужно использовать . %f— это командная строка, которую нужно исправить как минимум в 3 местах.
  • Я бы разместил команды внутри do ( ... )на отдельных строках.
  • Вы можете сделать паузу перед закрытием)
  • Вы можете закомментировать первую строку, чтобы remувидеть, что делает пакетный файл.
  • Добавьте echoк строке полезной нагрузки nircmd.
  • Удалите, echoкогда посчитаете, что это работает.
  • В некоторых местах вам нужно использовать !вместо %внутри forцикла (именно enabledelayedexpansionдля этого он и нужен — он позволяет расширять переменные во время выполнения, а не во время синтаксического анализа)

Начните со следующего пакетного файла (я исправил для вас основные ошибки):

@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

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD- Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • включеноотложенное расширение- Отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа.
  • для /р- Циклический просмотр файлов (рекурсивный просмотр подпапок).
  • набор- Отображение, установка или удаление переменных среды CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
  • установитьлокальный- Установите параметры для управления видимостью переменных среды в пакетном файле.

решение2

Я нашел другое решение, просто вызвав функцию.

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

Спасибо всем за вашу помощь.

Связанный контент