我正在尝试使用Strawberry Perl中的pmcmd命令运行Informatica PowerCenter工作流程。如果源文件中接收到任何错误数据,我将无法正常工作。一旦PowerCenter工作流失败,我想从Perl脚本(而不是从Session属性中的Post session任务)发送电子邮件。请帮助从perl脚本捕获工作流状态。非常感谢您的时间和帮助。
我尝试了多个选项,例如使用system(),qw(),IPC :: Run3,IPC :: System :: Simple qw(system)等,但仍然无法捕获工作流程执行的成功或失败。 我也知道pmcmd getworkflowdetails,但这是我的最后选择。
use strict;
use warnings;
use IPC::Run3;
use IPC::System::Simple qw(system);
my ($stdout, $stderr,$command,$run);
$command = "pmcmd.exe startworkflow -sv......." # not putting the complete command as it is very lengthy
$run = run3($command);
if ( $run == 0) {
print "success";
} else {
print "fail ";
}
我有2个工作流程,其中1个失败并且1个运行成功。但是无论我尝试哪种选择,它都为工作流程执行提供相同的结果。
答案 0 :(得分:2)
这些方法各自具有不同的指示成功的方法,并且也有两种不同的成功类型:是否成功执行以及进程返回的退出状态。
IPC::System::Simple system
将在命令失败或返回非零状态时引发异常。您可以通过传递arrayref作为第一个参数来定义可接受的非零状态。当您想允许错误导致程序因有用的错误消息而死亡时,这是最简单的,因此您不需要任何异常处理(如eval或try / catch)。
use strict;
use warnings;
use IPC::System::Simple qw(system EXIT_ANY);
system $cmd; # failure or non-zero exit will cause program to die
my $exit = system EXIT_ANY, $cmd; # failure to execute will cause program to die
use Syntax::Keyword::Try;
try {
system $cmd;
} catch {
# error in $@
}
try {
my $exit = system [0..5], $cmd;
if ($exit) {
# one of the allowed non-zero exit status
}
} catch {
# error in $@
}
try {
my $exit = system EXIT_ANY, $cmd;
if ($exit) {
# non-zero exit status
}
} catch {
# error starting command in $@
}
如果命令失败,IPC::Run3将引发异常,并将$?设置为等待状态。其返回值始终为true。
use strict;
use warnings;
use IPC::Run3;
use Syntax::Keyword::Try;
try {
run3 $cmd;
if ($?) {
# non-zero exit status
my $exit = $? >> 8;
}
} catch {
# error starting command in $@
}
qx
或作为readpipe运算符的反引号不会引发异常,但是如果命令未能启动,则将返回undef,否则将$?
设置为与IPC相同的方式: :Run3。
use strict;
use warnings;
my $output = `$cmd`;
if (!defined $output) {
# error occured starting command, check $!
} elsif ($?) {
# non-zero exit status
my $exit = $? >> 8;
}
内置的system函数将返回等待状态,如果命令启动失败,则返回-1,并在$?
中设置相同的值。
use strict;
use warnings;
system $cmd;
if ($? == -1) {
# error occured starting command, check $!
} elsif ($?) {
# non-zero exit status
my $exit = $? >> 8;
}
请注意,除了readpipe运算符(请参阅我的IPC::ReadpipeX)以外,所有这些选项都支持以列表形式传递命令,该命令绕过了外壳程序,因此在命令可能包含任意输入时更安全,但有时可以是Windows上的越野车,因为它只假装绕过那里的外壳程序。
system 'pmcmd.exe', 'startworkflow', '-sv', ...;
run3 ['pmcmd.exe', ...];
答案 1 :(得分:1)
感谢格林纳斯的时间和解释!这对我的知识真的很有帮助。对于我的问题,问题出在我的pmcmd命令上。我没有使用-wait选项作为参数。因此,pmcmd命令仅返回通用错误代码0。使用-wait之后,我可以捕获工作流失败状态。再次感谢 !
对于遇到相同问题的任何人,这是我正在使用的完整命令:
pmcmd.exe startworkflow -sv <integrationservice> -d <domain> -u <user> -p <pwd> -f <folder name> -paramfile <parameter file name> -wait <workflow name>