我正在编写一个相当冗长的PowerShell脚本来执行许多功能。在大多数情况下,一切进展顺利。
但是,我在脚本的所有级别运行的另一个函数是一个非常详细的日志。我将发布命令行部分作为示例(简化):
$Batch = $RunMe[1]
$ResultCode = (Invoke-Expression $Batch -ErrorAction Stop)
$ResultCode
我的预期结果是:
Return Code 0
然后我会记录它。相反,我得到的东西是:
C:\batchfiles\batchfile.bat argument
我正在使用Invoke-Expression
执行的命令。
对变量的一些快速解释:
$RunMe
是一个存储命令的数组(0是“Batch”或“Proc”,1是要运行的命令)
$Batch
在编写的代码中创建(这是对它的第一个引用)
$CurrFileToExec
是当前正在处理的文件(脚本一次在文件夹上运行)。我正在使用它来替换我从SQL获得的命令行。
我无法让$ResultCode
传递正确的命令输出。它只是再次传递命令行函数($Batch
)。
正如我所说,实际的功能部分工作得很好,但是我无法将返回代码转到我的日志文件中。
答案 0 :(得分:5)
如果我可以假设$ batch包含外部可执行文件,则返回代码将位于自动变量$ LASTEXITCODE中 - invoke-expression的返回包含由外部应用程序写入STDOUT和STDERR的内容或写入powershell输出或错误流的内容脚本。如果你调用了它,它将不包含可执行文件的dos样式返回码。
答案 1 :(得分:4)
解决方案是修改我的$Batch
变量,将cmd /c
添加到开头。我认为仅使用Invoke-Expression
和输出参数的范围存在问题。我添加了一行:
$Batch = "cmd /c " + $Batch
然后又跑了,$ResultCode
有了预期的输出。