получить два последних файла из папки в пакетном скрипте - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь написать пакетный скрипт, который получает два последних файла на основе времени создания из данного каталога. В этом пакетном скрипте я хочу вызвать файл .exe, который принимает эти два файла в качестве аргументов.

Может ли кто-нибудь помочь мне с этим.

dir /a:-d-s /b /o:-d /t:c

Это команда, которую я использовал, чтобудет перечислять имена файлов в порядке убывания в зависимости от времени создания. Команда выводит результат на консоль, но я хочу присвоить его некоторой переменной или массиву и получить доступ к двум верхним именам файлов.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Вот комментированный пакетный файл для этой задачи.

@echo off
rem Set up a local environment for this batch file with enabled command
rem extensions as required for command FOR and with disabled delayed
rem environment variable expansion to process also correct file names
rem with one or more exclamation marks in name.
setlocal EnableExtensions DisableDelayedExpansion

rem Make directory of the batch file the current directory.
rem It is possible to use any other directory on replacing
rem %~dp0 by a directory path.
pushd "%~dp0"

rem Make sure the environment variable File1 is not defined.
set "File1="

rem Get a list of files without system attribute in current directory
rem ordered by creation date with newest first and oldest last and process
rem this list of file names line by line with ignoring the batch file. The
rem loop processing the file names is exited after having assigned second
rem newest created file in this directory to the environment variable File2
rem in addition to newest file assigned to environment variable File1 with
rem a jump to the command line below the line with label RunProgram.
for /F "eol=| delims=" %%I in ('dir /A-D-S /B /O-D /TC 2^>nul') do (
    if not "%%I" == "%~nx0" (
        if not defined File1 (
            set "File1=%%I"
        ) else (
            set "File2=%%I"
            goto RunProgram
        )
    )
)

rem There is no file or just one file found in current directory other
rem than this batch file and so the program cannot be executed at all.
goto EndBatch

rem Run the program with the file names of the two newest
rem created files in current directory (batch file directory).
:RunProgram
"C:\Path To Application\Application.exe" "%File1%" "%File2%"

rem Restore the initial current directory and also the initial environment
rem variables list on starting of this batch file as well as initial state
rem of command extensions and delayed environment variable expansion.
:EndBatch
popd
endlocal

Чтобы понять используемые команды и их работу, откройте окно командной строки, выполните следующие команды и полностью прочитайте все страницы справки. очень тщательно отображается для каждой команды.

  • call /? ... объясняет %~dp0 (диск и путь к пакетному файлу) и %~nx0 (имя и расширение пакетного файла).
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?
  • rem /?
  • set /?
  • setlocal /?

Прочтите статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul. Оператор перенаправления > должен быть экранирован с помощью символа вставки ^ в FOR командной строке, чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме с %ComSpec% /c, и указанная добавленная командная строка.

0 голосов
/ 10 октября 2019

Следующий пример предназначен для установки двух самых верхних возвращаемых файлов как переменных типа массива %Newest[1]% и %Newest[2]%

@For /F "Delims==" %%A In ('Set Newest[ 2^>NUL')Do @Set "%%A="
@For /F "Tokens=1*Delims=:" %%A In ('Dir /B/A-D-S/O-D/TC 2^>NUL^|FindStr /N "^"'
)Do @If %%A LEq 2 (Set "Newest[%%A]=%%B")Else GoTo Next
:Next
@Set Newest[ 2>NUL&&Pause

Последняя строка была включена только для того, чтобы показать вам любые переменные, созданные изпетля. Очевидно, вы заменили бы эту строку своим собственным кодом или оставили бы как есть, и поместили бы свой код под ним. Если вы хотите использовать последние созданные метки даты и времени вместо созданных, замените /TC на /TW в строке 2


Не по теме : вотпример его использования, основанный на вашем позже опубликованном вопросе, после удаления:
@Echo Off
For /F "Delims==" %%A In ('Set Newest 2^>NUL')Do Set "%%A="
For /F "Tokens=1-2*Delims=:" %%A In ('Dir /B/A-D-S/O-D/TC "Checkpoints" 2^>NUL^
 ^|FindStr /N "^"')Do If %%A LEq 2 (Set "Newest%%A=%%B")Else GoTo Next
:Next
Set "DT1="&For /F "Tokens=1*Delims=_" %%A In ('Set Newest 2^>NUL'
)Do If Not Defined DT1 (Set "DT1=%%~nB")Else Set "DT2=%%~nB" 
If Not Defined DT1 Exit /B
Set "Target=Differences\Difference_%DT1%_%DT2%.csv"
Set Newest 2>NUL
Set Target 2>NUL
If Not Exist "Differences\" MD "Differences"
Pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...