我无法弄清楚这个的语法,我有一个需要从另一个脚本调用的配置脚本。当我手动调用配置脚本时,它看起来像这样
config.ps1 -val1 "1234" -val2 "12.089"
。我需要使用 Start-Process 使用参数调用 config.ps1,并且不打开新窗口(非交互式)并捕获 config.ps1 的退出代码并等待它返回退出代码,然后再继续下一步.
这是我最近尝试过的
$process = Start-Process powershell.exe -FilePath "c:\config.ps1" -ArgumentList -val1 "1234" -val2 "12.089" -PassThru -WindowStyle Hidden -Wait;
以 Daniel 的有用评论为基础。
您的代码的问题:
$process = Start-Process powershell.exe -FilePath "c:\config.ps1" -ArgumentList -val1 "1234" -val2 "12.089" -PassThru -WindowStyle Hidden -Wait
您正在调用
powershell.exe
,因此需要将其作为传递给 Start-Process
的 -FilePath
参数的参数。
其他所有内容 - 目标 PowerShell 脚本、
c:\config.ps1
及其参数 - 都必须传递给 -ArgumentList
参数,如果需要,最好以嵌入引号的single 字符串的形式完成。
-WindowStyle Hidden
):
$process =
Start-Process -PassThru -Wait -FilePath powershell.exe -ArgumentList @'
-File "c:\config.ps1" -val1 "1234" -val2 "12.089"
'@
请注意,虽然在这种特殊情况下省略 -File
的 powershell.exe
参数,但 Windows PowerShell CLI 原则上也会起作用 - 在这种情况下隐含 -Command
,但有一个重要的区别:
仅 -File
powershell.exe
进程的退出代码传递,而 -Command
仅报告 abstract退出代码:任何非零 退出代码都会映射到
1
。
$process.ExitCode
然后反映脚本的退出代码。
退一步:
来调用PowerShell脚本(
*.ps1
文件)进程中,这始终是同步(即,PowerShell在继续之前等待脚本终止):
# Direct, in-process invocation.
# If the script path must be quoted or is stored in a variable,
# use &, the call operator (e.g., & "c:\config.ps1" ...)
c:\config.ps1 -val1 1234 -val2 12.089
调用,例如,使用直接从 PowerShell (Core) 7
会话调用powershell.exe
、Windows PowerShell CLI CLI 调用的调用是同步调用的更简单的解决方案,您可以稍后通过以下方式查询其退出代码$LASTEXITCODE
powershell.exe -File c:\config.ps1 -val1 1234 -val2 12.089
您的
Start-Process
-WindowStyle Hidden
,因此隐藏脚本生成的任何输出;如果您同样想隐藏直接调用中的所有输出,请将 *>$null
添加到上面的命令中。