Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Обращение к самому новому/последнему файлу в папке (http://forum.oszone.net/showthread.php?t=340422)

Sisin 06-05-2019 10:56 2870583

Обращение к самому новому/последнему файлу в папке
 
В папке создаются файлы с названиями вида: log210, log211, log212 и т.д.

Как лучше указать в bat на самый новый/последний файл в папке???

Условно говоря: Program.exe /F "C:\11\log212" надо заменить C:\11\log212 на новый последний файл.

Iska 06-05-2019 11:35 2870585

Sisin, «новый/последний» — по дате создания или по дате последней модификации?

Sisin 06-05-2019 11:36 2870586

Цитата:

Цитата Iska
по дате создания или по дате последней модификации? »

По дате создания. Файлы создаются и не меняются.
Можно по числу в названии после log. Оно только увеличивается.

Iska 06-05-2019 12:37 2870599

Файлы действительно не имеют расширения и всегда имеют log в начале имени?
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=C:\11
set sMask=log*.

if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d /o:d /t:c "%sSourceFolder%\%sMask%"`) do (
                set sLastFile=%%~i
        )
       
        if defined sLastFile (
                "Program.exe" /F "%sSourceFolder%\!sLastFile!"
        ) else (
                echo Nothing found.
                exit /b 2
        )
) else (
        echo Can't find source folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0


megaloman 06-05-2019 15:00 2870619

То же, но без If
Код:

@Echo Off
cls
        Set "Prg="Program.exe" /F"

        Set "Mask=log*."
        Set "BoxIn=C:\11"
       
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO (
                Start " " %Prg% "%BoxIn%\%%f"
                Exit /B
        )
        Echo !!! Folder Or Files "%BoxIn%\%Mask%" not found
Exit /B 1


Sisin 06-05-2019 15:24 2870622

megaloman, а как в Вашем варианте дописать ключи такого вида:

Program.exe /F "C:\11\log212" /D "C:\11" /DW

В варианте от ISKA я разобрался, а тут не срабатывает.

Iska 06-05-2019 15:39 2870623

Цитата:

Цитата Sisin
а как в Вашем варианте дописать ключи такого вида:
Program.exe /F "C:\11\log212" /D "C:\11" /DW »

Например, так (не проверялось):
Код:

Set "Prg=Program.exe"

Start "" "%Prg%" /F "%BoxIn%\%%f" /D "%BoxIn%" /DW


Sisin 06-05-2019 15:43 2870624

Iska, я также и сделал, но не сработало почему-то.

Iska 06-05-2019 15:57 2870627

Sisin, теоретически возможно (не проверялось), что параметр «/D "…"» поглощает команда start.

Sisin 06-05-2019 16:00 2870628

Цитата:

Цитата Iska
Sisin, теоретически возможно (не проверялось), что параметр «/D "…"» поглощает команда start. »

Нет, это я убирал.

megaloman 06-05-2019 16:30 2870634

Sisin, Попробуйте вариант
Код:

@Echo On
cls
        Set "Mask=log*."
        Set "BoxIn=C:\11"

        Set "Prg="Program.exe" /F "%BoxIn%\%%f" /D "%BoxIn%" /DW"
       
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO (
                Start " " %Prg%
                Exit /B
        )
        Echo !!! Folder Or Files "%BoxIn%\%Mask%" not found
Exit /B 1

Допустим, Ваш батник называется bat.bat
Запустите его так: bat.bat >C:\kuku.txt 2>&1
Приложите файл C:\kuku.txt к сообщению для анализа
@Echo On в боевом варианте надо заменить на @Echo Off, хотя это не сильно принципиально.
Цитата:

Цитата Iska
теоретически возможно (не проверялось), что параметр «/D "…"» поглощает команда start. »

Можно попробовать убрать Start " " и, опять же, запустить батник bat.bat >C:\kuku222.txt 2>&1
Файлы в студию.

Sisin 06-05-2019 16:41 2870637

Цитата:

Цитата megaloman
Sisin, Попробуйте вариант »

Работает в таком виде, ничего не менял, благодарю.

Sisin 14-05-2019 12:57 2871624

Перед предложенными вариантами в батнике выполняется некая Startprogram.exe, которая создает log210, log211, log212 и т.д.
Как сделать, чтобы в начале предложенных вариантов проверялось создала ли Startprogram.exe новый файл или нет?
т.е., например, запускается батник, запоминается, что последний файл в папке "C:\11\" log212, далее start /wait "" "Startprogram.exe", далее проверяется появился новый файл log213, если нет - то выход, если да - то запускаются вышепредложенные варианты:

Вариант 1
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=C:\11
set sMask=log*.

if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d /o:d /t:c "%sSourceFolder%\%sMask%"`) do (
                set sLastFile=%%~i
        )
       
        if defined sLastFile (
                "Program.exe" /F "%sSourceFolder%\!sLastFile!"
        ) else (
                echo Nothing found.
                exit /b 2
        )
) else (
        echo Can't find source folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0



Вариант 2
Код:

@Echo On
cls
        Set "Mask=log*."
        Set "BoxIn=C:\11"

        Set "Prg="Program.exe" /F "%BoxIn%\%%f" /D "%BoxIn%" /DW"
       
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO (
                Start " " %Prg%
                Exit /B
        )
        Echo !!! Folder Or Files "%BoxIn%\%Mask%" not found
Exit /B 1


megaloman 14-05-2019 15:00 2871650

Цитата:

Цитата Sisin
Как сделать, чтобы в начале предложенных вариантов проверялось создала ли Startprogram.exe новый файл или нет »

Код:

@Echo Off
cls
        Set "Mask=log*."
        Set "BoxIn=C:\11"
        Set "Prg1="C:\Windows\System32\notepad.exe" "C:\11\log213.""
       
        Set "Prg="Program.exe" /F "%BoxIn%\%%f" /D "%BoxIn%" /DW"
       
        Set "OldFile="               
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:D /T:C`) DO Set "OldFile=%%f"
        %Prg1%
               
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO (
                If /I "%%f"=="%OldFile%" (Echo !!! Last file "%BoxIn%\%OldFile%".  New file not created! &Exit /B 1)
                Start " " %Prg%
                Exit /B
        )
        Echo !!! Folder Or Files "%BoxIn%\%Mask%" not found
Exit /B 2

Красную строку замените четко по образцу, сохраняя кавычки, на свою Startprogram.exe

Sisin 14-05-2019 16:16 2871674

А вот это "C:\11\log213."" зачем??
log213 меняется после каждого запуска Startprogram.exe.
Например, сейчас последний файл log586.

Может я не понял как надо изменить
Код:

Set "Prg1="C:\Windows\System32\notepad.exe" "C:\11\log213.""

megaloman 14-05-2019 16:31 2871676

Sisin, я не знаю, как работает Ваша программа Startprogram.exe, с какими ключами,откуда берётся нумерация. Я просто подменил её для примера и отладки, чтобы был понятен формат ее описания.
Цитата:

Цитата megaloman
Красную строку замените четко по образцу, сохраняя кавычки, на свою Startprogram.exe

Вам необходимо эту строку заменить на описание вызова Вашей программы, например (это мои абстрактные измышления, я не телепат):
Код:

Set "Prg1="Startprogram.exe" "%BoxIn%" /kuku"
Повторюсь, я не знаю, как вызывается Ваша программа, правильно её прописать - Ваша задача. Альтернатива: приведите пример её вызова, чтобы я мог вставить её в свой код.

Sisin 14-05-2019 16:48 2871678

Цитата:

Цитата megaloman
Повторюсь, я не знаю, как вызывается Ваша программа, правильно её прописать - Ваша задача. Альтернатива: приведите пример её вызова, чтобы я мог вставить её в свой код. »

Так она и не консольная, поэтому написано start /wait "" "Startprogram.exe". Ключей нет.
Я в Gui выбираю то, что мне надо и выхожу. Появляется log с числом большим на 1.

megaloman 14-05-2019 17:12 2871683

Имхо, будет вполне достаточно
Код:

Set "Prg1="Startprogram.exe""
хотя можно и так:
Код:

Set "Prg1=start /wait " " "Startprogram.exe""

Sisin 15-05-2019 10:28 2871785

Запускаю батник, открывается GUI Startprogram.exe, ничего там не делаю и закрываю, новый log соответственно не создается, но Program.exe все равно обрабатывает уже обработанный log, хотя должно появиться сообщение New file not created!.

megaloman 15-05-2019 11:02 2871791

Sisin, Этого не может быть, в чём-то Вы искажаете код.
Вот отладочный вариант батника. Допустим, он называется bat.bat
Запустите его в виде
bat.bat >C:\txt.txt 2>&1
Получившийся файл C:\txt.txt прикрепите к сообщению.
Код:

@Echo On
cls
        Set "Mask=log*."
        Set "BoxIn=C:\11"
        Set "Prg1="Startprogram.exe""
       
        Set "Prg="Program.exe" /F "%BoxIn%\%%f" /D "%BoxIn%" /DW"
       
        Set "OldFile="               
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:D /T:C`) DO Set "OldFile=%%f"
Echo ========OldFile "%OldFile%"
Dir "%BoxIn%\%OldFile%"
 
        %Prg1%
               
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO (
                If /I "%%f"=="%OldFile%" (Echo !!! Last file "%BoxIn%\%OldFile%".  New file not created! &Exit /B 1)
Echo ========NewFile "%%f"  ========OldFile "%OldFile%"
Dir "%BoxIn%\%%f"
Echo ========Start " " %Prg%
                Start " " %Prg%
                Exit /B
        )
        Echo !!! Folder Or Files "%BoxIn%\%Mask%" not found
Exit /B 2


Sisin 15-05-2019 11:36 2871795

Вот пример.
Запускаю ниженаписанный батник для проверки и открывается окно paint, хотя должно появиться сообщение New file not created!

Код:

@echo Off
cls
        set "Mask=log*."
        set "BoxIn=C:\11\"
        set "Prg1=start /wait " " "C:\Program Files\Windows NT\Accessories\wordpad.exe""
       
        set "Prg="C:\Windows\System32\mspaint.exe"
       
        set "OldFile="               
        for /F "usebackq delims=" %%f in (`2^>nul dir "%BoxIn%\%Mask%" /b /a:-d /o:-d /t:c`) do set "OldFile=%%f"
        %Prg1%
               
        for /F "usebackq delims=" %%f in (`2^>nul dir "%BoxIn%\%Mask%" /b /a:-d /o:-d /t:c`) do (
                if /I "%%f"=="%OldFile%" (Echo !!! Last file "%BoxIn%\%OldFile%".  New file not created! &Exit /B 1)
                start " " %Prg%
                exit /B
        )
        echo !!! Folder Or Files "%BoxIn%\%Mask%" not found
exit /B 2


megaloman 15-05-2019 12:13 2871800

Sisin, Вы зачем-то руками переписали мой батник. Там, похоже, куча ошибок. Теперь это уже Ваш код. Я бы не хотел в нём ковыряться и выискивать в чём загвоздка. Так, на не очень внимательный взгляд,
set "BoxIn=C:\11\"
Set "BoxIn=C:\11"

set "Prg="C:\Windows\System32\mspaint.exe"
Set "Prg="C:\Windows\System32\mspaint.exe""

for /F "usebackq delims=" %%f in (`2^>nul dir "%BoxIn%\%Mask%" /b /a:-d /o:-d /t:c`) do set "OldFile=%%f"
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:D /T:C`) DO Set "OldFile=%%f"
Такой for ломает логику скрипта. Обратите внимание, в моём коде ключи у Dir в двух For разные.

Может, что-то еще извращено ....
Возьмите мой код 1:1, поставьте в описаниях свои пути, программы по образцу моих. Я Вас умоляю, не надо ничего извращать.

Sisin 15-05-2019 12:48 2871804

Каюсь, невнимательность...

Причина в этом (/O:D):

Цитата:

Цитата megaloman
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:D /T:C`) DO Set "OldFile=%%f" »

Искренне благодарю за терпение!

Knaps 22-05-2019 22:39 2872742

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

for %%i in (log*) do set LOG_FILE=%%~fi

alpap 23-05-2019 15:41 2872797

Knaps,
смотря какой принцип нумерации, даже последовательный по нарастанию, вот ваша строка в коде ниже, запустите код и убедитесь что будет выведен файл не с номером 31, как вы вероятно предполагаете:
Код:

@echo off
if not exist TEMP md TEMP
pushd "%~dp0TEMP"
 for /l %%n in (1 1 31) do rem:>log%%n.txt
 for %%i in (log*) do set LOG_FILE=%%~fi
 echo %LOG_FILE%
popd
pause


Knaps 25-05-2019 19:54 2872996

Спасибо за замечание, но при такой нумерации файл по имени не будет в самом конце, так что все в силе.

alpap 26-05-2019 00:01 2873022

Цитата:

Цитата Knaps
файл по имени не будет в самом конце »

именно!
Цитата:

Цитата Knaps
при такой нумерации »

что я привел? Или при нумерации ТС
Цитата:

Цитата Sisin
log210, log211, log212 »

в чем отличие? Вы судите лишь по трем файлам? И о чем это говорит? Почему она (нумерация) не может быть в точности как я привел?
приведенная вами строка, еще раз повторяю, не даст правильного результата, мы не получим файл с максимальным номером вашей строкой при такой нумерации как я привел. Если бы нумерация была: log001, log002, ..., log210, log211, log212, то да, но это неизвестно пока ТС не просветит этот вопрос.

Knaps 26-05-2019 20:19 2873109

Цитата:

Цитата alpap
что я привел? Или при нумерации ТС »

При той, что привели вы.

Цитата:

Цитата alpap
Почему она (нумерация) не может быть в точности как я привел? »

А кто говорит, что не может быть?

Рекомендую еще раз перечитать:
Цитата:

Цитата Knaps
Если искомый файл по имени тоже в самом конце, то можно сделать проще: »

Очевидно, что если файл по имени не в самом конце, то нужен другой способ.

alpap 27-05-2019 16:32 2873228

Цитата:

Цитата Knaps
Очевидно, что если файл по имени не в самом конце, то нужен другой способ »

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

Sisin 28-05-2019 10:17 2873335

Цитата:

Цитата alpap
log001, log002, ..., log210, log211, log212, то да, но это неизвестно пока ТС не просветит этот вопрос. »

Господа, изначально было log001.

alpap 28-05-2019 13:14 2873366

Цитата:

Цитата Sisin
было log001 »

Knaps, могу поздравить со случайностью в вашу пользу, при такой нумерации пройдет поиск "по максимуму".

Knaps 02-06-2019 23:34 2874147

alpap, я просто не считаю людей вокруг идиотами и считаю, что человеку достаточно предложить решение и, возможно, обратить внимание, что оно применимо не всегда, а дальше он сам примет решение. Но вот точно не стоит лезть и доказывать, что чье-то решение плохое, если оно не охватывает 100% случаев. Просто надо быть добрее и доброжелательнее.

alpap 03-06-2019 12:00 2874192

Цитата:

Цитата Knaps
и, возможно, обратить внимание, что оно применимо не всегда »

Цитата:

Цитата Knaps
надо быть добрее »

да не всегда, знаете поговорку "Медвежья услуга". Пользователь в силу своего незнания примет любой предложенный код за "чистую монету" и самое что интересное что на каком-то этапе все будет работать (при удачном стечении обстоятельств), но когда что-то откажет может произойти непоправимое, нужные файлы уже не восстановить и тогда человек перестанет вообще кому-то верить. Я не говорю что можно написать код предусмотрев все "подводные камни" и на все случаи жизни - нет конечно, но уйти от явно возможных проблем, тем более когда есть такая возможность, все-таки стоит. А вам советую прислушиваться к тому что говорят, а не жадно спорить, просто так от нечего делать я не делаю замечаний, только когда они уместны более чем нет и здесь тот случай, так что не обижайтесь.

Knaps 26-06-2019 20:04 2876973

Знаю, вот только она не применима в данном случае. Повторюсь, не надо считать всех вокруг глупее себя, превращая форум в сборище скрипткидди.

Sisin 27-06-2019 14:23 2877065

Код:

@echo Off
cls
        set "Mask=log*."
        set "BoxIn=C:\11\"
        set "Prg1=start /wait " " "C:\Program Files\Windows NT\Accessories\wordpad.exe""
       
        set "Prg="C:\Windows\System32\mspaint.exe"
       
        set "OldFile="               
        for /F "usebackq delims=" %%f in (`2^>nul dir "%BoxIn%\%Mask%" /b /a:-d /o:-d /t:c`) do set "OldFile=%%f"
        %Prg1%
               
        for /F "usebackq delims=" %%f in (`2^>nul dir "%BoxIn%\%Mask%" /b /a:-d /o:-d /t:c`) do (
                if /I "%%f"=="%OldFile%" (Echo !!! Last file "%BoxIn%\%OldFile%".  New file not created! &Exit /B 1)
                start " " %Prg%
                exit /B
        )
        echo !!! Folder Or Files "%BoxIn%\%Mask%" not found
exit /B 2

Господа, можно ли сделать так, чтобы во время выполнения start /wait " " "C:\Program Files\Windows NT\Accessories\wordpad.exe"" еще "выполнялось":

Код:

ping -n 1 localhost>Nul
tasklist | find /i "wordpad.exe.exe" && nircmd.exe sendkeypress enter
ping -n 36 localhost>Nul
tasklist | find /i "wordpad.exe.exe" && nircmd.exe sendkeypress enter
tasklist | find /i "wordpad.exe.exe" && nircmd.exe sendkeypress enter
tasklist | find /i "wordpad.exe.exe" && nircmd.exe sendkeypress enter
ping -n 1 localhost>Nul

т.е. условно надо запустить wordpad.exe, вызвать нажатия кнопок, и только после этого переходить к продожению выполнения остального.

Iska 27-06-2019 19:42 2877131

Sisin, когда Вы делаете start /wait programm — дальше ничего не происходит, пока не будет завершено исполнение programm.

Sisin 27-06-2019 23:20 2877177

Цитата:

Цитата Iska
дальше ничего не происходит, пока не будет завершено исполнение programm. »

Про это я в курсе) Ищу выход.

Sisin 28-06-2019 12:54 2877221

А можно ли через start /wait как-то запустить другой батник и дождаться его завершения??

start /wait " " CMD /c "1.bat"

Iska 28-06-2019 19:55 2877264

Цитата:

Цитата Sisin
start /wait " " CMD /c "1.bat" »

Sisin, Вы не поверите:
Код:

call "1.bat"


Время: 21:07.

Время: 21:07.
© OSzone.net 2001-