我正在尝试将PowerShell脚本作为XML文件中的节点,该文件返回1或0的退出代码。然后我想在与父PS脚本分开的实例中运行此脚本但返回退出代码返回到父实例,以便我可以根据ExitCode编写一个If语句。
现在我使XML PowerShell脚本变得简单(这似乎没有任何问题,但似乎没有问题):
exit 1
这是我在父PS脚本中的代码:
#write XML script to string then convert string to scriptblock
[String]$installCheck_ScriptString = $package.installcheck_script
$installCheck_Script = [Scriptblock]::Create($installCheck_ScriptString)
#start new instance of powershell and run script from XML
$process = (Start-Process powershell.exe -ArgumentList "-command {$installCheck_Script} -PassThru -Wait")
$installCheck_ScriptResult = $process.ExitCode
If ($installCheck_ScriptResult -gt 0)
{
....
}
在玩代码时,我似乎得到一条消息,Wait或Passthru是意外的令牌,或者我没有得到任何ExitCode值。 $LastExitCode
始终返回0。
答案 0 :(得分:2)
-Wait
和-PassThru
不是powershell.exe
的有效参数。您的意思是将它们应用于此类Start-Process
吗?
$process = (Start-Process powershell.exe -ArgumentList "-command {$installCheck_Script}" -PassThru -Wait)
请注意,您将遇到此方法的一些问题。如果$installCheck_Script
包含任何需要转义的字符,您将会进行大量检查和替换。
您可以通过-EncodedCommand
使用powershell.exe
并传入脚本的base64编码版本来避免这种情况:
$encodedScript = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($installCheck_Script))
$process = (Start-Process powershell.exe -ArgumentList "-EncodedCommand",$encodedScript -PassThru -Wait)
但是,如果你坚持通过shell进行调用,那么只能这样做。
作为您正在做的事情(炮轰)的替代方案,您可以考虑创建一个作业,然后使用实际返回值代替使用退出代码:
$installCheck_Script = " 1 " # for example
$sb = [ScriptBlock]::Create($installCheck_Script)
$job = Start-Job -ScriptBlock $sb
$job | Wait-Job
$code = $job | Receive-Job
如果您想获得更好的性能,可以使用运行空间进行处理。 PoshRSJob Module允许您以与使用作业类似的方式使用运行空间,从而使这变得更容易。