如何制作一个批处理文件来启动一个进程并等待该进程终止?

如何制作一个批处理文件来启动一个进程并等待该进程终止?

我的电脑不是最好的,但它确实满足玩游戏的最低要求侠盗猎车手5。我想让游戏运行得更快,所以我不使用普通的 .exe,而是使用这个批处理文件来启动游戏:

start steam://rungameid/271590 
timeout 60
wmic process where name="GTA5.exe" CALL setpriority "high priority"
wmic process where name="gtavlauncher.exe" CALL setpriority "idle"
wmic process where name="subprocess.exe" CALL setpriority "idle"

所以基本上在启动游戏后,它会设置优先级,以便只有 GTA5.exe 运行,而 CPU 会忽略随之而来的其他进程。我希望它运行得更顺畅,将 Windows 主题更改为“经典”有助于实现这一点,所以我下载了一个程序允许我使用 cmd 命令更改主题,我制作了这个脚本-

START c:\ThemeSwitcher classic
start steam://rungameid/271590 
timeout 60
wmic process where name="GTA5.exe" CALL setpriority "high priority"
wmic process where name="gtavlauncher.exe" CALL setpriority "idle"
wmic process where name="subprocess.exe" CALL setpriority "idle"
wait process where name="GTA5.exe" 
-----------------------------------------------------------
start c:\ThemeSwitcher MY PC

在“----------”中,我想添加一些内容,让文件等待进程终止后再将主题更改为正常,这样我就不必手动执行此操作了。我只知道一些我在谷歌上搜索过的批处理命令,但目前它们没有帮助。抱歉我的英语不好。

答案1

创建这样的批次:

title i'm waiting
start /wait /high cmd /ktitle kill me 
echo This is the end 
pause

您可以看到start命令如何与wait参数一起工作

您可以使用创建批处理pause,在批处理窗口中执行某些操作后按空格键,然后运行下一个命令

你可能正在寻找类似的东西waiting for terminate existing process

echo do somthing at start
:start_test
::wait ~6s -1s = 5s
::you can use TIMEOUT 5
call :sleep 6
wmic process where name="notepad.exe" get name |find "notepad.exe">nul
if %errorlevel%==0 goto :start_test
echo do somthing at the end
::pause
goto :eof

:sleep
ping 127.0.0.1 -n %1 > nul
goto :eof

它的测试过程每5秒存在一次,您可以更改间隔。

答案2

另一种仅启动一个新进程的方法是使用 PowerShell!

您可以使用 cmdlet 按名称查找进程Get-Process。每个进程对象都有一个WaitForExit方法,正如预期的那样,该方法会阻塞直到该进程停止。因此,此 PowerShell 命令将挂起GTA5.exe,直到gtavlauncher.exe、 和subprocess.exe退出:

Get-Process 'gta5', 'gtavlauncher', 'subprocess' | % {$_.WaitForExit()}

这将查找具有这些名称的所有进程并等待每个进程退出。直到所有进程都退出后,提示才会再次出现。

您可以使用它来阻止批处理脚本,方法是启动 PowerShell 并输入该命令(我使用别名将其缩短了一点):

powershell -command "gps 'gta5','gtavlauncher','subprocess'|%{$_.WaitForExit()}"

一旦进程退出,PowerShell 将退出并将控制权返回给批处理脚本。

相关内容