Я пытаюсь написать командный файл, который перебирает каждое имя файла, принимает часть строк и устанавливает даты создания и изменения. Имейте в виду, 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 не делает паузу в программе после цикла. Как это можно переписать для работы?

2 ответа2

2

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

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

  • Это не %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.
  • enabledelayedexpansion - отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа.
  • for /r - перебирать файлы (подпапки Recurse).
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
  • setlocal - устанавливает параметры для контроля видимости переменных среды в командном файле.
1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .