У меня проблемы с этим сценарием. Я объясню ниже кодовый блок.
@Echo off
pushd "\serverfolder"
SETLOCAL EnableDelayedExpansion
@FOR /F "TOKENS=2" %%A IN ('WHERE /T "testfiles*.*"') DO @(
set fdate123=%%A
echo !fdate123:~5,9!0!fdate123:~0,1!!fdate123:~2,2!
call StringLen !fdate123!
)
pause
:StringLen
Setlocal EnableDelayedExpansion
:: strLen String [RtnVar]
:: -- String The string to be measured, surround in quotes if it contains spaces.
:: -- RtnVar An optional variable to be used to return the string length.
Set "s=#%~1"
Set "len=0"
For %%N in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%N,1!" neq "" (
set /a "len+=%%N"
set "s=!s:~%%N!"
)
)
Endlocal&if "%~2" neq "" (set %~2=%len%) else echo %len%
Exit /b
То, что я пытаюсь сделать, это получить дату изменения файла и изменить формат этой даты, возвращенной на ГГГГММДД. Я хочу, чтобы измененная дата была добавлена к имени файла. У меня могут быть файлы из нескольких дней в этой папке, и каждый файл может иметь свою дату изменения даты.
Пожалуйста, не отмечайте это как дублирующий вопрос, потому что я не мог найти этот подход для этого здесь.
Я пытался проверить длину строки даты, чтобы я мог обрабатывать даты, такие как 01.01.2009 (длина 8) против 13.01.2009 (длина 9) против 01.10.2009 (длина 9) против 10 / 22/2019 (длина 10), затем, используя операторы if, соответствующим образом анализируют дату с помощью чего-то вроде! Fdate123: ~ 5,9 !! fdate123: ~ 0,1 !! fdate123: ~ 2,2! - Я еще не закончил это.
Я попытался получить дату с помощью dir /T:W testfiles*.*
И запустить findstr, но я не достаточно хорошо понимаю findstr, чтобы сделать это.
Я также попытался forfiles /M BC_Services_Adjustment* /C "cmd /c echo @fdate"
его из forfiles /M BC_Services_Adjustment* /C "cmd /c echo @fdate"
и также перешел к этому.
Может быть, у кого-то есть лучшее решение, я думаю, что сейчас у меня беспорядок. Кто-нибудь знает, как получить метку времени изменения даты для каждого файла в папке, преобразовать ее в переменную в формате ГГГГММДД и затем добавить ее во все файлы в папке?
Примечание: я не ищу решения powershell для этого вопроса, не тратьте свое время на публикацию ответов powershell.
Всего 1 ответ
FOR /F "TOKENS=2" %%A IN ('WHERE /T "testfiles*.*"') DO (
for /f "tokens=1-3delims=/-." %%i in ("%%A") do set "mm=00%%i"&set "dd=00%%j"&set "yy=0000%%k"
set "fdate123=!mm:~-2!!dd:~-2!!yy:~-4!"
echo !fdate123!
)
должно позволить вам построить данные в соответствии с вашими пожеланиями.
Внутренний if
присваивает mm
, dd
и yy
соответствующим образом, используя указанные разделители, анализируя %%A
в качестве литерала. Каждому предшествует соответствующее количество нулей. Затем необходимая строка строится с использованием подстроки, выбирающей последние 2/4 символа строки, поэтому получается 8-символьный вывод.
Я использую формат dd/mm/yyyy
и на самом деле не тестировал этот метод, но манипулирование им в соответствии с вашими требованиями должно быть очевидным, единственная проблема на самом деле заключается в том, как обрабатывать даты yy
как отличающиеся от дат yyyy
, если это вызывает озабоченность.