如何使用pmcmd命令行捕获PERL环境中PowerCenter工作流的成功/失败状态?

时间:2019-10-16 22:49:37

标签: perl command-line informatica informatica-powercenter strawberry-perl

我正在尝试使用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个运行成功。但是无论我尝试哪种选择,它都为工作流程执行提供相同的结果。

2 个答案:

答案 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>