在它自己的实例中运行Scriptblock并在PowerShell中将ExitCode返回到父脚本

时间:2015-10-09 22:13:58

标签: powershell

我正在尝试将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。

1 个答案:

答案 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允许您以与使用作业类似的方式使用运行空间,从而使这变得更容易。