PDA

Показать полную графическую версию : Обращение к самому новому/последнему файлу в папке


Страниц : [1] 2

Sisin
06-05-2019, 10:56
В папке создаются файлы с названиями вида: log210, log211, log212 и т.д.

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

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

Iska
06-05-2019, 11:35
Sisin, «новый/последний» — по дате создания или по дате последней модификации?

Sisin
06-05-2019, 11:36
по дате создания или по дате последней модификации? »

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

Iska
06-05-2019, 12:37
Файлы действительно не имеют расширения и всегда имеют 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
То же, но без 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
megaloman, а как в Вашем варианте дописать ключи такого вида:

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

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

Iska
06-05-2019, 15:39
а как в Вашем варианте дописать ключи такого вида:
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
Iska, я также и сделал, но не сработало почему-то.

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

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

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

megaloman
06-05-2019, 16:30
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, хотя это не сильно принципиально.
теоретически возможно (не проверялось), что параметр «/D "…"» поглощает команда start. »
Можно попробовать убрать Start " " и, опять же, запустить батник bat.bat >C:\kuku222.txt 2>&1
Файлы в студию.

Sisin
06-05-2019, 16:41
Sisin, Попробуйте вариант »

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

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

@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

@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
Как сделать, чтобы в начале предложенных вариантов проверялось создала ли 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
А вот это "C:\11\log213."" зачем??
log213 меняется после каждого запуска Startprogram.exe.
Например, сейчас последний файл log586.

Может я не понял как надо изменить Set "Prg1="C:\Windows\System32\notepad.exe" "C:\11\log213.""

megaloman
14-05-2019, 16:31
Sisin, я не знаю, как работает Ваша программа Startprogram.exe, с какими ключами,откуда берётся нумерация. Я просто подменил её для примера и отладки, чтобы был понятен формат ее описания. Красную строку замените четко по образцу, сохраняя кавычки, на свою Startprogram.exeВам необходимо эту строку заменить на описание вызова Вашей программы, например (это мои абстрактные измышления, я не телепат):Set "Prg1="Startprogram.exe" "%BoxIn%" /kuku"Повторюсь, я не знаю, как вызывается Ваша программа, правильно её прописать - Ваша задача. Альтернатива: приведите пример её вызова, чтобы я мог вставить её в свой код.

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

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

megaloman
14-05-2019, 17:12
Имхо, будет вполне достаточноSet "Prg1="Startprogram.exe""хотя можно и так:Set "Prg1=start /wait " " "Startprogram.exe""

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

megaloman
15-05-2019, 11:02
Sisin, Этого не может быть, в чём-то Вы искажаете код.@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




© OSzone.net 2001-2012