Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как определить, что FIND выпал с ошибкой Недостаточно памяти

Ответить
Настройки темы
CMD/BAT - Как определить, что FIND выпал с ошибкой Недостаточно памяти

Новый участник


Сообщения: 26
Благодарности: 4

Профиль | Отправить PM | Цитировать


Изменения
Автор: EdMSL
Дата: 16-10-2022
Приветствую.
Есть код, определяющий, запущен ли процесс, и на его основании запускает игру или стим:
Код: Выделить весь код
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 она обрабатывается и дальше все работает.
Или может есть какой-то другой способ проверки запущен ли процесс?

Отправлено: 15:32, 15-10-2022

 

Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 10:02, 16-10-2022 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 26
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось EdMSL, 16-10-2022 в 10:55.


Отправлено: 10:19, 16-10-2022 | #3


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


EdMSL, А если так (не тестировал):
Код: Выделить весь код
TaskList /FI "ImageName EQ %steam%" 2>&1| Find /I "%steam%">nul &&GoTo :Game

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 14:03, 16-10-2022 | #4


Новый участник


Сообщения: 26
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:42, 16-10-2022 | #5


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6690
Благодарности: 1566

Профиль | Отправить PM | Цитировать


Может, перейти на более современные техники (powershell)?
Код: Выделить весь код
if (get-process steam.exe) {
...код запуска игры
}
else {
проверка реестра или что ещё там
}
steam.exe - это предположение, впишите реальное название процесса стима (полный список - get-process).

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:34, 16-10-2022 | #6


Новый участник


Сообщения: 26
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:43, 16-10-2022 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6690
Благодарности: 1566

Профиль | Отправить PM | Цитировать


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

Цитата EdMSL:
Как мне использовать powershell в таком случае? »
Вызывать powershell.exe, а как аргумент к нему передавать что-то типа
Код: Выделить весь код
-file "C:\путь\к\скрипту\скрипт.ps1" -executionpolicy bypass
В конце концов, скрипты .ps1 можно скомпилировать в .exe.

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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 16:38, 16-10-2022 | #8


Новый участник


Сообщения: 26
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:57, 16-10-2022 | #9


Новый участник


Сообщения: 26
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:54, 19-10-2022 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как определить, что FIND выпал с ошибкой Недостаточно памяти

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Сканер samsung2070 выдает Недостаточно памяти. Что делать? Френк Хочу все знать 5 19-03-2021 22:34
Загрузка - [решено] Не обновляется до 1709: Недостаточно памяти для создания диска в памяти, 0xc0000017 Sattt Microsoft Windows 10 4 15-04-2018 22:45
Разное - [решено] Как отключить уведомление "в системе недостаточно памяти" ? HarrysFerrarievich Microsoft Windows 7 11 09-02-2011 00:21
[решено] как определить какой у мя процессор и тип памяти? Triz Хочу все знать 1 07-03-2008 21:55
BSOD - Как с помощью дампа памяти определить драйвер, вызывающий BSOD Vadikan Устранение критических ошибок Windows 0 04-11-2007 03:10




 
Переход