
Я пытаюсь написать пакетный файл, который проходит по каждому имени файла, берет часть строк и устанавливает даты создания и изменения. Обратите внимание, 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
Спасибо всем за вашу помощь.