Получить последний измененный файл - PullRequest
0 голосов
/ 29 апреля 2019

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

Первое, что я сделал предварительно, использовал вещь /T:W, и она работала очень хорошо;проблема возникает, когда имя файла использует два (или более) числа.

for /f %%x in ('dir C:\foldercmd\*.cmd /B /T:W ') do set "cmdFile=%%x"

Итак, я получаю вывод:

C:\Users\foldercmd>set "cmdFile=cmdWork_1.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_10.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_11.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_12.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_2.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_3.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_4.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_5.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_6.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_7.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_8.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_9.cmd"

И я хочу получить:

C:\Users\foldercmd>set "cmdFile=cmdWork_1.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_2.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_3.cmd"
[...]
C:\Users\foldercmd>set "cmdFile=cmdWork_11.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_12.cmd"

Ответы [ 4 ]

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

Я собираюсь ответить на этот вопрос чисто по названию. Получить последний измененный файл

@echo off
for /f "delims=" %%i in ('dir "C:\foldercmd\*.cmd" /b /a-d /o-d') do set "cmdfile=%%i" & goto :end
:end
echo %cmdfile%

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

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

Два чистых пакетных решения, ищущих наибольшее использованное число.

  1. с использованием счетной петли

    :: Q:\Test\2019\04\29\SO_55899758.cmd
    @Echo off
    for /l %%L in (1,1,100) do if not exist "C:\foldercmd\cmdwork_%%L.cmd" (
        set /a "No=%%L-1"
        goto :Done
    )
    Echo Highest number is greater 100
    Goto :Eof
    :Done
    echo Highest used number is %No%
    pause
    
  2. разделение имени на подчеркивание и сравнение с предыдущим

    :: Q:\Test\2019\04\29\SO_55899758_2.cmd
    @Echo off & Setlocal EnableDelayedExpansion
    set "No=0"
    for /f "tokens=2 delims=_." %%L in ('
        dir /B "C:\foldercmd\cmdwork_*.cmd"
    ') do if %%L gtr !No! set "No=%%L"
    echo Highest used number is %No%
    pause
    
0 голосов
/ 29 апреля 2019

Если вам не удалось изменить процесс, который называет файлы, и вы все еще хотите отсортировать по именам, вы можете использовать из вашего :

For /F "Delims=" %%A In ('PowerShell -NoP^
 "GCI "C:\foldercmd" -Fi "cmdWork_*.cmd"|Sort{If($_ -Match '(\d+)')"^
 "{[int]$Matches[1]}}|Select -Exp Name"')Do Set "cmdFile=%%A"

Приведенный выше пример проходит по каждому файлу, set по очереди, до последнего, но вы можете попросить вернуть только последний, если вы только хотели:

For /F "Delims=" %%A In ('PowerShell -NoP^
 "GCI "C:\foldercmd" -Fi "cmdWork_*.cmd"|Sort{If($_ -Match '(\d+)')"^
 "{[int]$Matches[1]}}|Select -Exp Name -L 1"')Do Set "cmdFile=%%A"
0 голосов
/ 29 апреля 2019

В соответствии с Dir /? переключатель /O позволяет сортировать.Если вы хотите сделать это, основываясь на дате последнего изменения, вы можете использовать D, поэтому вы получите:

Dir /OD

Это то, что вы ищете?

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