не возвращаю пустое время - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь получить имя и время самого старого файла в папке (по дате изменения).

Я могу получить имя без проблем, используя этот код

for /f "delims=" %%x in ('dir /b /o-d /a-d %currentfolder% ^| grep -v / ') do (SET FILEINFO=%%x )

Насколько я понимаю, замена %% x на %% ~ tx должна вернуть измененное время вместо имени файла.Но вместо этого я получаю пробел.

for /f "delims=" %%x in ('dir /b /o-d /a-d %currentfolder% ^| grep -v / ') do (SET FILEINFO=%%~tx )

Следующий код возвращает время файла в папке, но не самого старого.

for %%a in (%currentfolder%\*) do (set LAST_TIME=%%~ta)

Я попытался объединить первое ипоследний код для получения времени самого старого файла, но он также возвращает пробел.

    for %%b in (%currentfolder%\%FILEINFO%) do (set MAXDATE=%%~tb)

В чем здесь ошибка?Как я могу решить это?

Большое спасибо за помощь

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Вы почти у цели:

@echo off
set "currentfolder=D:\some directory\"
pushd "%directory%"
for /f "delims=" %%i in ('dir /b /a-d /od') do (
    set "file=%%i"
    set "moddate=%%~ti"
    goto :done
)
popd
:done
echo %file% %moddate%

Таким образом, мы сортируем по дате (сначала самое старое), затем устанавливаем первое имя файла как %file%, а его дату - %moddate%, затем выходим из цикла, чтобы он не делал то же самое для других файлов в папке.

0 голосов
/ 24 апреля 2019

Проблема вызвана тем, что ваш текущий рабочий каталог, на который указывает 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, тогда вы получите дату / время последнего изменения этого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...