使用参数运行批处理文件&;Powershell中的返回代码
更新:已解决,请参阅注释 我正在尝试在powershell脚本中运行批处理文件,其中需要传递两个参数并读取返回代码 我尝试读取$LASTEXITCODE,但它总是返回“0” 这不会将参数传递给批处理文件:使用参数运行批处理文件&;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
& $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"