invoke-expression不会在powershell中引发错误

时间:2015-06-27 08:16:07

标签: powershell

我正在创建自定义表单并使用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 invoke表达式的错误处理事项时,问题就开始了。

当我们将表达式表示为

时,在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调用相同的错误抛出脚本时,表单不会创建,因为它不会抛出任何错误。所以我请求我在这方面提供指导。提前谢谢。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我一直在使用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返回它。或许有人指出我不知道的一些细微差别,我们都学到了一些东西。 ;)