【问题标题】:invoke-expression doesnot throw an error in powershell调用表达式不会在 powershell 中引发错误
【发布时间】:2015-07-04 02:18:12
【问题描述】:

我正在创建自定义表单,并使用 forms.vbs 将其添加到打印机服务器属性中,并通过 cmd 运行它。脚本如下

cscript 'C:\Tools\forms.vbs' -a -n "DD" -u inches -h 7.48 -w 7.48 -t 0 -e 0 -b 7.48 -r 7.48

在命令提示符下运行时效果很好。

现在我将这段代码调用到 powershell 如下,它也可以正常工作

  $formname = "DD"
  $cmd = "cscript 'C:\Tools\forms.vbs' -a -n " + '"' + $formname + '"' + " -u inches -h 7.48 -w 7.48 -t 0 -e 0 -b 7.48 -r 7.48 "
  Invoke-Expression  $cmd 

当我想到检查 powershell 调用表达式的错误处理时,问题就开始了。

在 cmd 中当我们将表达式设为

cscript 'C:\Tools\forms.vbs' -a -n "DD" -u inches -h 7.48 -w 7.48 -t 0 -e 0 -b 0 -r 0

根据form.vbs 中给出的注释,这肯定会引发错误,并且不会创建表单。

因此,当我向我的 powershell 调用相同的引发错误的脚本时,表单并没有创建,也没有引发任何错误。所以请我在这方面进行指导。提前致谢。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    Invoke-Expression 仅检查是否可以运行该命令。例如,如果找不到 cscript.exe,Invoke-Expression 会抛出 ObjectNotFound 异常。

    它不检查命令的退出代码或以任何方式解析其输出。但是,您应该能够看到输出。

    确保不要在表达式中混用单引号和双引号:

    $formname = "DD"
    # Note double quotes around C:\Tools\forms.vbs
    $cmd = 'cscript "C:\Tools\forms.vbs" -a -n ' + '"' + $formname + '"' `
        + ' -u inches -h 7.48 -w 7.48 -t 0 -e 0 -b 7.48 -r 7.48 '
    Invoke-Expression $cmd
    

    输出:

    Microsoft (R) Windows Script Host Version 5.8
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    Unable to add form DD, error code: 0x1A8. Object required
    

    如果你想让你的代码抛出异常,你需要手动解析输出,例如:

    try {
        $output = Invoke-Expression $cmd 
        if ($output -like "*error code*") { throw $output }
    }
    catch [System.Exception] {
        $message = ($Error[0].Exception -split [System.Environment]::NewLine)[-1]
        $message
    }
    

    输出:

    Unable to add form DD, error code: 0x1A8. Object required
    

    【讨论】:

    • 嗨,亚历山大,感谢您的回复。抛出异常的代码工作正常。但是我仍然没有收到有关 Invoke-expression $cmd 的任何消息。比如“无法添加表单,错误代码:0X1A8”。
    • 在我的代码中 $output 使用 Invoke-Expression 输出,但您可以在异常文本中看到它。我用 PowerShell 2.0 对其进行了测试。
    • 我使用的是 4.0 版。这有什么改变吗?
    • Alexander,当我在 ISE 中运行它时,出现了错误。但是当我将脚本保存在一个函数下并调用它(Powershell Windows Application-using Winforms)时,错误没有出现
    • 如何根据错误分离输出?
    【解决方案2】:

    我一直在使用 Start-Process 来管理安装和卸载,并且最近开始对任意可执行文件使用相同的方法,这似乎有点像您正在尝试做的事情,所以...

    $new.ExitCode > $null
    $filepath = 'cscript.exe'
    $argumentList = "C:\Forms.vbs"       
    $exitCode = (Start-Process -FilePath:$filePath -argumentList:$argumentList -wait -errorAction:Stop -PassThru).ExitCode
    $exitCode
    

    VBS 只是抛出一个消息框并以返回码退出,就像这样。

    MsgBox "Text"
    WScript.Quit 4
    

    关闭消息框后,我会在 PowerShell 控制台中返回 4。在没有 Wscript.Quit 或没有提供退出代码的情况下,我得到了预期的 0。 简单的示例,但可能会让您接近,假设您可以将所需的错误代码放入变量中,以便您可以从 VBS 返回它。或者也许有人指出了一些我不知道的细微差别,我们都学到了一些东西。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多