2010-07-24 57 views
2

我写一个脚本检查注册表值,并退出,如果是0。当我运行该脚本(它会继续,如果值是1)PowerShell的出口不工作

if ((Get-ItemProperty -path HKLM:\SOFTWARE\ICT\LoginScript).proceed -eq 0) { 

     $form.close() 
     exit    

     } 

reg值为0时,它无法退出并引发异常:

System.Management.Automation.ExitException: System error. 
    at System.Management.Automation.FlowControlNode.Execute(Array input, Pipe outputPipe, ExecutionContext context) 
    at System.Management.Automation.ParseTreeNode.Execute(Array input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context) 
    at System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, Array input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context) 
    at System.Management.Automation.StatementListNode.Execute(Array input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context) 
    ... 

该脚本正在使用Windows窗体 - 不确定是否相关?

编辑:

我已经剧本归纳为以下测试:

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

$Form = New-Object System.Windows.Forms.Form 

$Form.Add_Shown({ $Form.Activate(); start-sleep -s 3; exit; $form.close() }) 
$Form.ShowDialog() 

这仍然给出了错误。如果我在非Windows窗体上运行start-sleep -s 3; exit代码,它可以正常工作,因此它看起来像是Windows窗体绑定的问题。

感谢,

+0

Get-ItemProperty似乎是不相关的 - 在我的测试中这是正确的(尽管如果找不到路径它会抛出)。我认为这个问题是与$ form.close()。您需要展示更多内容(如何声明$ form等)。 – TrueWill 2010-07-24 21:57:32

+0

您能否发布可重现此问题的完整脚本?创建一个仍然重现问题并在此处发布的最小示例。 你也可以尝试通过命令行(即不是从脚本文件)执行整个事情,并报告这个错误是否仍然存在。 – 2010-07-26 02:22:31

+0

请参阅上面的编辑 - 错误似乎与Windows窗体? – Ben 2010-07-26 08:23:55

回答

1

指定exit有作为Exit-PSSession同样的效果。看着stacktrace,我认为代码试图从不同的线程结束交互式会话,这就是为什么它失败了。

你只是想结束脚本?您可以尝试使用[Runspace]::DefaultRunspace.CloseAsync()

+0

我试过了,但得到了一个不同的错误,说明管道已经停止了。另外,Exit-PSSession似乎也没有结束脚本?命令没有错误,但它只是在Exit-PSSession之后继续运行已经执行 – Ben 2010-07-26 09:22:06

+0

这听起来像你只需要使用函数和/或布尔值,如果测试失败,只需在某处设置一个布尔值,以表示不希望执行脚本的其余部分。例如,在代码块之前,如果测试失败,您不希望执行代码块,只需加上'if($ failed){exit}' – 2010-07-26 09:45:54

+0

这样的东西 - 事后看来我认为这将是最好的乔治,谢谢你的帮助。 – Ben 2010-07-26 09:52:02