PowerShell - 输出到不起作用的变量

时间:2010-11-12 18:11:01

标签: powershell

我正在编写一个相当冗长的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)。

正如我所说,实际的功能部分工作得很好,但是我无法将返回代码转到我的日志文件中。

2 个答案:

答案 0 :(得分:5)

如果我可以假设$ batch包含外部可执行文件,则返回代码将位于自动变量$ LASTEXITCODE中 - invoke-expression的返回包含由外部应用程序写入STDOUT和STDERR的内容或写入powershell输出或错误流的内容脚本。如果你调用了它,它将不包含可执行文件的dos样式返回码。

答案 1 :(得分:4)

解决方案是修改我的$Batch变量,将cmd /c添加到开头。我认为仅使用Invoke-Expression和输出参数的范围存在问题。我添加了一行:

$Batch = "cmd /c " + $Batch

然后又跑了,$ResultCode有了预期的输出。