使用参数运行批处理文件&;Powershell中的返回代码

使用参数运行批处理文件&;Powershell中的返回代码,powershell,batch-file,Powershell,Batch File,更新:已解决,请参阅注释 我正在尝试在powershell脚本中运行批处理文件,其中需要传递两个参数并读取返回代码 我尝试读取$LASTEXITCODE,但它总是返回“0” 这不会将参数传递给批处理文件: & $BATCH_PATH $REQUIRED_PARAMETERS $OPTIONAL_PARAMETERS | Out-File -FilePath "$COMPARE_DIR\$LOG_FILENAME.log" -Append & $BATCH_PATH

更新:已解决,请参阅注释

我正在尝试在powershell脚本中运行批处理文件,其中需要传递两个参数并读取返回代码

我尝试读取$LASTEXITCODE,但它总是返回“0”

这不会将参数传递给批处理文件:

& $BATCH_PATH $REQUIRED_PARAMETERS $OPTIONAL_PARAMETERS | Out-File -FilePath "$COMPARE_DIR\$LOG_FILENAME.log" -Append
& $BATCH_PATH $REQUIRED_PARAMETERS $OPTIONAL_PARAMETERS` 这是可行的,但LASTEXITCODE始终为“0”:

这是可行的,但LASTEXITCODE始终为“0”:

我还尝试获取Process对象的ExitCode属性,但它也是0;dr

不必通过添加
exit/b%ERRORLEVEL%
语句来修改批处理文件,您可以通过添加
&exit
来修改批处理文件的调用,以达到相同的效果:

cmd.exe /c "$($ROOT_DIR)\batch.bat $REQUIRED_PARAMETERS $OPTIONAL_PARAMETERS & exit" | 
  Out-File -FilePath "$COMPARE_DIR\$LOG_FILENAME.log" -Append
这种模糊的解决方案是由于以下不幸的事实所必需的:
cmd.exe
在从外部调用批处理文件时,无论是直接调用批处理文件还是通过
cmd.exe/c
调用批处理文件,都不能可靠地将批处理文件的退出代码中继为其进程退出代码。有关详细信息,请参阅

注:

  • 模块随附的
    ie
    函数(
    Install module Native
    )自动应用此解决方法,以便调用
    ie“$($ROOT\u DIR)\batch.bat”…
    将按照设置
    $LASTEXITCODE
    的原样工作(尽管您必须单独或通过数组变量传递参数,如前所述)

  • 主张将此解决方案构建到PowerShell本身中,作为改进Windows上外部程序的参数传递的更大提案的一部分,但该提案不适用


至于你所尝试的

这不会将参数传递给批处理文件:

& $BATCH_PATH $REQUIRED_PARAMETERS $OPTIONAL_PARAMETERS | Out-File -FilePath "$COMPARE_DIR\$LOG_FILENAME.log" -Append
& $BATCH_PATH $REQUIRED_PARAMETERS $OPTIONAL_PARAMETERS` 我还尝试获取Process对象的ExitCode属性,但它也是0

仅为直接调用外部程序而设置,而不是在使用时设置-即

(正如您的语句所暗示的,当使用
Start process
时,可以获取流程的退出代码,即通过向调用添加
-Wait-PassThru
,以等待流程退出并返回一个实例,然后可以检查其退出代码


在本例中,这不会产生任何影响,因为问题在于
cmd.exe本身,而不是它的调用方式。)

我在批处理文件中添加“exit/b%ERRORLEVEL%”后解决了问题,然后创建答案或删除您的问题。 Start-Process -FilePath "C:\Windows\System32\cmd.exe" -ArgumentList "/c", "$BATCH_PATH", "$REQUIRED_PARAMETERS", "$OPTIONAL_PARAMETERS" -WindowStyle Hidden -PassThru -Wait -RedirectStandardOutput "$COMPARE_DIR\$(Get-Random).log"