Проблема вызвана тем, что ваш текущий рабочий каталог, на который указывает for /F
, не совпадает с каталогом, в котором вы ищете файлы, по dir
.
Это можно исправить следующим образом.(опуская grep
, поскольку я не понимаю его цели здесь):
rem // Temporarily change to the directory containing the files of interest:
pushd "%currentfolder%"
rem /* The current working directory is now the target directory;
rem thus both `dir` and `for /F` work in the same directory: */
for /F "delims=" %%x in ('dir /B /A:-D /O:-D') do (set "FILEINFO=%%~tx")
rem // Restore the former working directory:
popd
rem // Just output the gathered information:
echo/%FILEINFO%
В качестве альтернативы, командная строка pushd
может быть заменена на cd /D "%currentfolder%"
при удалении popd
, учитывая, что вы делаетене нужно восстанавливать исходный рабочий каталог.
Чтобы понять, что происходит в вашем исходном коде, давайте предположим:
- текущий рабочий каталог
C:\TEST
; - содержимое переменной
currentfolder
равно D:\DATA
; - каталог
C:\TEST
содержит только пакетный файл; - каталог
D:\DATA
содержитфайл с именем some.txt
;
Командная строка dir /b /o-d /a-d %currentfolder%
возвращает только чистые имена файлов (из-за его опции /B
), поэтому на основе предварительно определенных данных примера выходные данные будут:
some.txt
Теперь этот текстзахвачен for /F
петлей.Теперь дата / время последней модификации запрашивается %%~tx
, что, конечно, требует доступа к файловой системе.Помните, что текущим рабочим каталогом является C:\TEST
, поэтому цикл for /F
пытается собрать информацию из следующего файла:
C:\TEST\some.txt
Поскольку такого файла не существует,вывод пуст.
Чтобы доказать это, просто поместите новый файл some.txt
в каталог C:\TEST
, тогда вы получите дату / время последнего изменения этого файла.