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

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

EdMSL 15-10-2022 15:32 2994235

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

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 2994276

EdMSL, Вы пишите:
Цитата:

Цитата 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 2994277

Цитата:

Цитата megaloman
Затем, что получилось, конвейером передаёте на Find »

Это старая часть кода, сейчас там нет >nul, невнимательно скопировал.
Цитата:

Цитата megaloman
Кстати, а почему бы не сделать без явного If: »

Тогда, если выскакивает ошибка о недостатке памяти, идет команда на запуск стим, даже если он запущен уже. Это меньшая проблема, т.к. так хотя бы не выскакивает ошибка Application load error 5:0000065434. Но тогда по несколько раз мерцает окно CMD с перезапуском.
И,выходит, ошибку о недостатке памяти никак не отследить? Ибо решения этой проблемы я тоже не нашел.

megaloman 16-10-2022 14:03 2994281

EdMSL, А если так (не тестировал):
Код:

TaskList /FI "ImageName EQ %steam%" 2>&1| Find /I "%steam%">nul &&GoTo :Game

EdMSL 16-10-2022 14:42 2994285

Цитата:

Цитата megaloman
А если так (не тестировал): »

Аналогично предыдущему. Если ошибка памяти, то отправляет команду на запуск стим, независимо от того, запущен он или нет.
В общем, пока FIND будет выдавать ошибку памяти, но завершаться с кодом 0, так и будут проблемы.

DJ Mogarych 16-10-2022 15:34 2994286

Может, перейти на более современные техники (powershell)?
Код:

if (get-process steam.exe) {
...код запуска игры
}
else {
проверка реестра или что ещё там
}

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

EdMSL 16-10-2022 15:43 2994287

Цитата:

Цитата DJ Mogarych
Может, перейти на более современные техники (powershell)? »

Мне нужен на выходе .bat или .exe, которые будут запускаться третьей программой (Mod Organizer). Как мне использовать powershell в таком случае? В bat-файле код Powershell не валидный естественно.
Я пробовал
Код:

powershell get-process | findstr "%steam%"
но результат тот же

DJ Mogarych 16-10-2022 16:38 2994290

Идея в том, чтобы выкинуть findstr и работать не со строками, а с объектами.

Цитата:

Цитата EdMSL
Как мне использовать powershell в таком случае? »

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

-file "C:\путь\к\скрипту\скрипт.ps1" -executionpolicy bypass
В конце концов, скрипты .ps1 можно скомпилировать в .exe.

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

EdMSL 16-10-2022 16:57 2994291

Цитата:

Цитата DJ Mogarych
Напишите, что конкретно должен делать код в случае, если Стим запущен или не запущен. »

Код:

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 2994402

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


Время: 15:30.

Время: 15:30.
© OSzone.net 2001-