PDA

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


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

Sisin
15-05-2019, 11:36
Вот пример.
Запускаю ниженаписанный батник для проверки и открывается окно 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
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
Каюсь, невнимательность...

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

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
Если искомый файл по имени тоже в самом конце, то можно сделать проще:
for %%i in (log*) do set LOG_FILE=%%~fi

alpap
23-05-2019, 15:41
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
Спасибо за замечание, но при такой нумерации файл по имени не будет в самом конце, так что все в силе.

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

Knaps
26-05-2019, 20:19
что я привел? Или при нумерации ТС »
При той, что привели вы.

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

Рекомендую еще раз перечитать:
Если искомый файл по имени тоже в самом конце, то можно сделать проще: »

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

alpap
27-05-2019, 16:32
Очевидно, что если файл по имени не в самом конце, то нужен другой способ »
давайте сначала ампутируем, а там посмотрим, может и не зря. Может не рисковать где не надо и сразу применять решение исключающее может, возможно да кабы.

Sisin
28-05-2019, 10:17
log001, log002, ..., log210, log211, log212, то да, но это неизвестно пока ТС не просветит этот вопрос. »

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

alpap
28-05-2019, 13:14
было log001 »
Knaps, могу поздравить со случайностью в вашу пользу, при такой нумерации пройдет поиск "по максимуму".

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

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

Knaps
26-06-2019, 20:04
Знаю, вот только она не применима в данном случае. Повторюсь, не надо считать всех вокруг глупее себя, превращая форум в сборище скрипткидди.

Sisin
27-06-2019, 14:23
@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
Sisin, когда Вы делаете start /wait programm — дальше ничего не происходит, пока не будет завершено исполнение programm.

Sisin
27-06-2019, 23:20
дальше ничего не происходит, пока не будет завершено исполнение programm. »

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

Sisin
28-06-2019, 12:54
А можно ли через start /wait как-то запустить другой батник и дождаться его завершения??

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

Iska
28-06-2019, 19:55
start /wait " " CMD /c "1.bat" »
Sisin, Вы не поверите:
call "1.bat"




© OSzone.net 2001-2012