Войти

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


EdMSL
15-10-2022, 15:32
Приветствую.
Есть код, определяющий, запущен ли процесс, и на его основании запускает игру или стим:

TaskList /FI "ImageName EQ %steam%">nul | Find /I "%steam%">nul
IF %errorLevel% == 0 goto GAME
проверка реестра
start "" /D ""%SteamPath%"" ""%steam%"" -applaunch 22330
exit
:GAME
...код запуска игры

Так вот если стим уже запущен, то код работает. Но если нет, то в случае, если TaskList /FI "ImageName EQ %steam%">nul | Find /I "%steam%">nul вываливается с ошибкой "Недостаточно ресурсов памяти для обработки этой команды.", то %errorLevel% остается 0, переходит в ветку GAME, и дальше вылетает ошибка стим Application load error 5:0000065434. Если же FIND отрабатывает и не находит процесса стима, %errorLevel% становится 1 и дальше все норм.
Так вот мне надо, чтобы если возникает ошибка о недостатке памяти, повторять проверку, пока она не пройдет. Раза со 2-3 она обрабатывается и дальше все работает.
Или может есть какой-то другой способ проверки запущен ли процесс?

megaloman
16-10-2022, 10:02
EdMSL, Вы пишите:TaskList /FI "ImageName EQ %steam%">nul »Затем, что получилось, конвейером передаёте на Find, который анализирует вывод TaskList .
Но, раз Вы написали для вывода TaskList >nul, то на Find ничего не попадет, и ErrorLevel, выданный Find, будет =1, и Ваш If теряет смысл.
Кстати, а почему бы не сделать без явного If:TaskList /FI "ImageName EQ %steam%"| Find /I "%steam%">nul &&GoTo :Game

EdMSL
16-10-2022, 10:19
Затем, что получилось, конвейером передаёте на Find »
Это старая часть кода, сейчас там нет >nul, невнимательно скопировал.
Кстати, а почему бы не сделать без явного If: »
Тогда, если выскакивает ошибка о недостатке памяти, идет команда на запуск стим, даже если он запущен уже. Это меньшая проблема, т.к. так хотя бы не выскакивает ошибка Application load error 5:0000065434. Но тогда по несколько раз мерцает окно CMD с перезапуском.
И,выходит, ошибку о недостатке памяти никак не отследить? Ибо решения этой проблемы я тоже не нашел.

megaloman
16-10-2022, 14:03
EdMSL, А если так (не тестировал): TaskList /FI "ImageName EQ %steam%" 2>&1| Find /I "%steam%">nul &&GoTo :Game

EdMSL
16-10-2022, 14:42
А если так (не тестировал): »
Аналогично предыдущему. Если ошибка памяти, то отправляет команду на запуск стим, независимо от того, запущен он или нет.
В общем, пока FIND будет выдавать ошибку памяти, но завершаться с кодом 0, так и будут проблемы.

DJ Mogarych
16-10-2022, 15:34
Может, перейти на более современные техники (powershell)?
if (get-process steam.exe) {
...код запуска игры
}
else {
проверка реестра или что ещё там
}

steam.exe - это предположение, впишите реальное название процесса стима (полный список - get-process).

EdMSL
16-10-2022, 15:43
Может, перейти на более современные техники (powershell)? »
Мне нужен на выходе .bat или .exe, которые будут запускаться третьей программой (Mod Organizer). Как мне использовать powershell в таком случае? В bat-файле код Powershell не валидный естественно.
Я пробовал
powershell get-process | findstr "%steam%"
но результат тот же

DJ Mogarych
16-10-2022, 16:38
Идея в том, чтобы выкинуть findstr и работать не со строками, а с объектами.

Как мне использовать powershell в таком случае? »
Вызывать powershell.exe, а как аргумент к нему передавать что-то типа

-file "C:\путь\к\скрипту\скрипт.ps1" -executionpolicy bypass

В конце концов, скрипты .ps1 можно скомпилировать в .exe (https://github.com/MScholtes/TechNet-Gallery/tree/master/PS2EXE-GUI).

Но надо менять код целиком, чтобы не заниматься извращениями по скрещиванию в одном скрипте cmd и ps.
Напишите, что конкретно должен делать код в случае, если Стим запущен или не запущен.

EdMSL
16-10-2022, 16:57
Напишите, что конкретно должен делать код в случае, если Стим запущен или не запущен. »

cd .\

set game=Oblivion.exe
set steam=steam.exe
set SteamPath=0
set From=%cd%
set To="%cd%\logs"

TaskList /FI "ImageName EQ %steam%" | Find /I "%steam%">nul && goto :GAME

For /F "Tokens=2*" %%I In ('Reg Query "HKLM\SOFTWARE\WOW6432Node\Valve\Steam" /V InstallPath') Do Set SteamPath="%%J"
IF %SteamPath% == 0 For /F "Tokens=2*" %%I In ('Reg Query "HKCU\SOFTWARE\Valve\Steam" /V SteamPath') Do Set SteamPath="%%J"

start "" /D ""%SteamPath%"" ""%steam%"" -applaunch 22330
exit

:GAME
start /WAIT "" "%game%"

IF NOT EXIST %To% (mkdir %To%)
FOR /R "%From%" %%f IN (*.log*) DO Move /Y "%%f" %To%>nul
Move /Y "%cd%\MessageLog.txt" %To%>nul
Move /Y "%cd%\RendererInfo.txt" %To%>nul
exit
Собственно, если стим не запущен, то мы запускаем стим и конкретную игру через него.
start "" /D ""!SteamPath!"" ""%steam%"" -applaunch 22330
У игры лаунчер запускает этот же батник, где, по идее, должна идти проверка снова, запущен ли стим. И так как он запущен, запускается уже игра
start /WAIT "" "%game%"
Ждем выхода из игры, переносим некоторые файлы в отдельную папку.
Все.
В идеале нужна проверка, что если ключи реестра не найдены, то делать предупреждение и выход, но я е добрался до этого еще.

IF %SteamPath% == 0 For /F "Tokens=2*" %%I In ('Reg Query "HKCU\SOFTWARE\Valve\Steam" /V SteamPath') Do Set SteamPath="%%J"
//Здесь проверка, что стим установлен
start "" /D ""%SteamPath%"" ""%steam%"" -applaunch 22330

EdMSL
19-10-2022, 06:54
Вопрос не актуален. Написал код для .exe на Паскале.
Однако, если будет у кого-то решение, то выкладывайте, интересно будет взгянуть.




© OSzone.net 2001-2012