我正在通过PowerShell脚本执行我的工作,但厨房出口返回代码似乎不起作用。。。基于我在下面阅读的文档,是厨房的返回代码
-
0=作业/转换运行时没有出现问题。
-
1=处理过程中发生错误。
-
2=加载/运行作业/转换期间发生意外错误。基本上,它可以是XML格式中的错误、读取文件时的错误,也可以表示存储库连接存在问题。
-
3=无法连接到数据库、打开文件或其他初始化错误。
-
7=无法从XML或存储库加载作业/转换;基本上,可能是plugins/文件夹中的某个插件编写不正确或不兼容。
-
8=加载步骤或插件时出错(主要是加载其中一个插件时出错(。
-
9=命令行用法打印。
$FilePath = 'C:pdi-ce-8.1.0.0-371data-integrationkitchen.bat' $ArgumentList = '-file=C:pdi_debugdebug.kjb -level=MINIMAL >> C:pdi_debugbat.log' $PDIProcess = Start-Process -Filepath $FilePath -ArgumentList $ArgumentList -Wait -PassThru Write-host "The Exit code from Kitchen is " $LastExitCode If($LastExitCode -eq 0) #This doesn't seem to correctly get the exit code we are wanting :-/ { $EMAIL_SUBJECT='INT: Pentaho_J_load SUCCEEDED' } Else { $EMAIL_SUBJECT='INT: Pentaho_J_load FAILED'
-
若要同步执行控制台应用程序或批处理文件并捕获其输出/检查其退出代码,请直接调用(
c:pathtosome.exe ...
或& $exePath ...
(,不要使用使用Start-Process
-请参阅此答案。-
使用
Start-Process
时,获取流程退出代码的唯一方式是通过流程信息对象(类型为[System.Diagnostics.Process]
(由-PassThru
开关及其.ExitCode
属性返回(带有-Wait
,此属性可立即访问;如果没有它,必须使用.WaitForExit()
,或轮询.HasExited
属性(。 -
相比之下,只有在直接调用外部程序之后(通过直接调用它,或者如果路径需要引用和/或涉及变量引用,则通过调用运算符
&
(,才会设置自动$LASTEXITCODE
变量。
-
因此,直接调用批处理文件,然后检查$LASTEXITCODE
:
C:pdi-ce-8.1.0.0-371data-integrationkitchen.bat -file=C:pdi_debugdebug.kjb -level=MINIMAL >> C:pdi_debugbat.log
注意:这将使PowerShell附加到文件C:pdi_debugbat.log
的(>>
(,这意味着总是[1]使用以下字符编码:
- 在Windows PowerShell中:";Unicode";(UTF-16LE(
- 在PowerShell(核心((v6+(中:无BOM UTF-8
如果需要cmd.exe
执行追加,请改为通过cmd /c
调用批处理文件:
cmd /c 'C:pdi-ce-8.1.0.0-371data-integrationkitchen.bat -file=C:pdi_debugdebug.kjb -level=MINIMAL >> C:pdi_debugbat.log'
注意:由于cmd.exe
在从cmd.exe
外部调用时如何中继批处理文件设置的退出代码有一些奇怪之处,调用批处理文件最稳健的方法是使用cmd /c
和将& exit
附加到命令字符串中-请参阅此答案。
[1]在PowerShell 5.1及以上版本中,可以控制>
/>>
使用的默认编码,尽管方式不明显:请参阅此答案