使用上一个问题的建议(当同名进程打开时超时后终止进程 - 批处理)我能够在超时后终止同名进程:
popd
pushd mypath
for /f %%i in ('powershell "(Start-Process myapp.exe -passthru).ID"') do (
timeout /t 180
taskkill /PID %%i
)
但是,我想在不显示(和闪烁)窗口的情况下启动该过程。 我发现了很多问题,例如:如何在不显示窗口的情况下运行 PowerShell 脚本?但我无法将它们合并到我的脚本中。我怎样才能做到这一点?
谢谢您的帮助
按照史蒂文的评论,我也在循环内添加了
-WindowStyle Hidden
。解决方案在这里:
pushd mypath
for /f %%i in ('powershell -WindowStyle Hidden -"(Start-Process myapp.exe -passthru -WindowStyle Hidden).ID"') do (
timeout /t 180
taskkill /PID %%i
)
tl;博士
要隐藏仅通过使用控制台应用程序(在您的情况下为Start-Process
)使用
myapp.exe
而产生的控制台窗口,请使用-WindowStyle Hidden
,如答案中所示,但您也可以简化并通过在单个 powershell.exe
调用中执行 all操作来缩短代码:
@echo off
powershell.exe -c "if (-not ($ps = Start-Process -WindowStyle Hidden myapp.exe -PassThru).WaitForExit(60000)) { Stop-Process $ps }"
用例:
隐藏默认情况下由PowerShell的Start-Process
-WindowStyle Hidden
-RedirectStandardOutput
和
-RedirectStandardError
参数;另外,为了检查退出代码,您需要使用
-PassThru
来获取代表新启动进程的对象。
current控制台窗口中查看程序的输出 - 尽管无法捕获它 - 请使用-NoNewWindow
-Wait
时才有意义,否则,异步运行的程序的输出将干扰您的显示(如果您无论如何都在等待,直接同步调用是更好的选择)。
-WindowStyle
,并且
-NoNewWindow
是implied,这使得
Start-Process
仅适用于在 Unix 上启动GUI 程序(包括在命令在默认网络浏览器中打开它们;例如
Start-Process http://example.org
)
运行批处理文件本身 - 或任何控制台应用程序 - 不可见:
Windows 目前为此提供没有直接机制;启动控制台应用程序总是会为其创建一个“可见”控制台。因此,解决方案需要一个 GUI 子系统 帮助程序文件或机制,(a) 本身不会创建控制台窗口,并且 (b) 允许在启动目标控制台应用程序时隐藏自动控制台窗口(但是,正在讨论潜在的未来增强,控制台的条件分配,这将允许应用程序根据运行时条件决定是否分配控制台,但请注意,只有设计为使用此功能的应用程序才会提供情境不分配-控制台启动)。
目前有几种
mshta.exe:
致电;一个简单的例子,它以不可见的方式运行
powershell.exe
本身并最终打开记事本;您可以从 Windows Run
对话框 (Win-R
) 运行它,以验证没有为 PowerShell 创建控制台窗口:
mshta.exe vbscript:(CreateObject("WScript.Shell").Run("powershell -c notepad.exe",0))(Window.Close)
*.vbs
辅助 WSH 脚本(*.js
或
wscript.exe
) - 请参阅此答案
。使用
项目,它提供了一个通用GUI子系统帮助程序可执行文件,您可以为目标可执行文件命名并附加w
。
请参阅
此答案在使用第三方
脚本可以为您创建的 PowerShell 脚本的 GUI 子系统 包装可执行文件;请参阅这个答案作为示例。
注意*.exe
也通过 Windows PowerShell SDK 执行。
PowerShell(核心) CLI、pwsh.exe
本身可能会在未来