#batch-file
#пакетный файл
Вопрос:
Мне нужно проверить, добавлен ли новый файл PDF в каталог, а затем я что-то делаю.
для этого я начинаю с этого пакетного скрипта:
@echo off
:loop
IF exist "*.pdf" (for %%i in (*.pdf) do set pdfname_new=%%i) ELSE ( goto loop)
ECHO %pdfname_new%
goto loop
Когда я создаю первый PDF-файл test1.pdf, он работает нормально и печатает test1
, затем, когда я добавил test2.pdf, он также работает и печатает test2.
проблема, когда я добавляю test0.pdf, он печатает test2
Я заметил, что он не обрабатывает последний созданный файл PDF, но он также должен быть последним в алфавитном порядке.
как я могу обработать последний созданный файл, даже если он не отсортирован последним в алфавитном порядке??
Комментарии:
1.
for /f "delims=" %%i in ('dir /b /o:d *.pdf') do set "file=%%~i">nul 2>amp;1
Последний измененный файл должен быть последним отсортированным файлом и будет файлом, который мы установили в переменной%file%
, поэтому `echo «%file%» после этой строки должен содержать последний файл..2. Чтобы уточнить, он никогда не печатается
test2
, потому%pdfname_new%
что всегда будет разрешатьсяtest2.pdf
, (set pdfname_new=%%~ni
будет делать то, что вы фактически опубликовали в качестве выходных данных.) . Проблема в том, что ваш вывод упорядочен не так, как вам хотелось бы. Чтобы решить эту проблему, вам необходимо убедиться, что ваша команда выполняет итерацию файлов, упорядоченных так, как вам нужно. Поскольку вы сказали «новые файлы», Герхард предположил, что порядок дат упорядочит ваши файлы более соответствующим образом для ваших нужд, и предоставил решение для этого. Если вы хотите, чтобы даты были упорядочены иначе, чем поmodified
, используйте/T
опцию сC
илиA
.3. Командный процессор Windows
cmd.exe
, обрабатывающий пакетный файл, не предназначен для задачи, вызванной событием. Ваш цикл, как написано в данный момент, занимает 100% одного ядра процессора только для проверки, создан ли файл PDF или скопирован в каталог. Так что это решение — очень плохое решение. Должна быть добавлена хотя бы командаtimeout
подождать несколько секунд, прежде чем запускать следующую проверку файла, которая освобождает ядро для других задач. Лучше всего было бы работать с атрибутом archive, поскольку атрибут archive всегда устанавливается автоматически для файла, созданного или измененного в каталоге.4. Пример для лучшего кода: первая строка
@echo off
, вторая строка:Loop
, третья строкаfor /F "eol=| delims=" %%I in ('dir "%~dp0*.pdf" /AA-D /B 2^>nul') do %SystemRoot%System32attrib.exe -a "%~dp0%%I" amp; echo Processing file "%~dp0%%I"
, четвертая строка%SystemRoot%System32choice.exe /C EN /N /D N /T 5 /M "Exit batch file with key E ..."
, пятая и последняя строкаif errorlevel 2 goto Loop
. Команда DIR выводит только файлы с установленным атрибутом архива. Атрибут archive сначала удаляется из файла перед дальнейшей обработкой, которая в этом примере заключается в простой печати имени файла.5. В последней строке используется команда
choice
для ожидания нажатия пользователем клавишиE
, и в этом случае обработка пакетного файла завершается. В противном случае опцияN
будет выбрана через пять секунд, что приведет к повторному запуску команды FOR . ВЫБОР команды не требует включения процессора в ожидании нажатия клавиши пользователем. Таким образом, использование ядра минимально для этого примера пакетного файла.
Ответ №1:
Вы можете либо использовать дату последнего изменения, используя dir /o:-d
(последний измененный файл будет последним в списке)
@echo off
:loop
for /f "delims=" %%i in ('dir /b /o:d "*.pdf"') do set "file=%%~i">nul 2>amp;1
echo "%file%"
timeout 5 /Nobreak >nul
goto :loop
или, если вы хотите сосредоточиться исключительно на дате / времени создания файла, используя /t:c
также указанный Compo в комментарии.
@echo off
:loop
for /f "delims=" %%i in ('dir /b /o:d /t:c "*.pdf"') do set "file=%%~i"
echo "%file%"
timeout 5 /Nobreak >nul
goto :loop