我想自动运行一些脚本,但无法使用内置函数,因为我不使用 explorer.exe 作为 shell。 所以我有了我的主要工具,它作为 shell 运行,然后集成了一个函数来启动我的自动运行脚本。 现在我的问题是,如果有 .ps1 文件,它总是等待它完成并且根本不继续。我希望它隐藏启动并立即继续运行我目录中的其他文件。
我的脚本(.cmd):
:: Loop through each file in the directory and start them
for %%F in (*.exe *.lnk *.cmd *.bat *.ps1) do (
echo Starting %%F...
if "%%~xF"==".ps1" (
start /B cmd /c powershell -Command "Start-Process PowerShell -ArgumentList '-ExecutionPolicy Bypass -File %%F' -WindowStyle Hidden"
) else (
start "" "%%F"
)
)
根据您自己的反馈,您的方法确实有效:它异步启动了(嵌套的)PowerShell 进程。
但是,您的命令可以简化以避免不必要的
cmd /c
调用:
start /b powershell -c Start-Process -WindowStyle Hidden powershell '-ExecutionPolicy Bypass -File %%F'
如果
%%F
有可能包含 空格(或其他 PowerShell 元字符):
start /b powershell -c "Start-Process -WindowStyle Hidden powershell '-ExecutionPolicy Bypass -File \"%%F\"'"
说明:
/b
告诉 cmd.exe
的内置 start
命令运行 powershell
,这是一个 console 应用程序,无需创建新的控制台窗口。
/WAIT
,但这有可能干扰调用者,这不是一个问题,因为这 powershell
的唯一目的实例是在隐藏窗口中启动另一个 PowerShell实例(见下文)。-c
(-Command
) 允许将任意一段 PowerShell 代码传递到 powershell
CLI。
Start-Process
cmdlet 允许启动任意进程;默认:
-Wait
更改它)-WindowStyle
参数控制其样式/可见性(类似于cmd.exe
的/B
选项,您可以使用-NoNewWindow
)。