Eclipse Perl在调试器中或作为Win32::Daemon时不执行命令 提要

Eclipse Perl在调试器中或作为Win32::Daemon时不执行命令 提要,eclipse,perl,activeperl,epic,Eclipse,Perl,Activeperl,Epic,我从Perl执行一个shell命令,当从命令行运行时,它可以工作,但当在调试器中运行时,它不工作。将其作为Win32::Daemon运行会显示相同的行为 源代码 我用反勾号执行命令 print `$cmd` 或者像这样: open FH, "$cmd |" or die "Couldn't execute $cmd: $!\n"; while(defined(my $line = <FH>)) { chomp($line); print "

我从Perl执行一个shell命令,当从命令行运行时,它可以工作,但当在调试器中运行时,它不工作。将其作为Win32::Daemon运行会显示相同的行为

源代码 我用反勾号执行命令

print `$cmd`
或者像这样:

open FH, "$cmd |" or die "Couldn't execute $cmd: $!\n"; 
    while(defined(my $line = <FH>)) {
        chomp($line);
        print "$line\n";
    }
close FH;
$cmd = '"C:\path\to\sscep.exe" getca -f "C:\path\to\config\capi_sscep.cnf"'
即使创建一个只执行此命令的小测试脚本,也只有在从命令行运行时才起作用

系统
  • Windows x64
  • 活动Perl v5.16.0,MSWin32-x64-多线程
  • 日食朱诺20120614-1722
什么有效 我可以打开管理员提示(脚本执行所需)并执行以下操作:

输出被打印到屏幕上,
$?
0

什么不起作用 使用相同的
perlscript.pl
调用启动Eclipse并运行调试会话。 添加服务和执行命令(使用Win32::Daemon创建)也不起作用。守护进程本身工作得非常好,并按预期启动了perl脚本。只有命令不会执行<如果使用
$?>>8
,不打印任何输出。退出代码不属于该程序

进一步详情 我调用的工具称为sscep,由我扩展。它使用OpenSSL API并加载capi引擎(Windows CryptoAPI)。但命令本身至少会在任何严重操作开始之前打印输出。我很乐意提供这方面的源代码,但我怀疑它是否有帮助

我能够进一步缩小范围:问题只存在于Perl程序(CertNanny)和二进制程序(sscep)的组合中。在CertNanny内部调用
dir
是可行的,在测试Perl脚本中调用
sscep
也是可行的。那么,在Perl中可以做些什么来阻止单个二进制文件被调用


这个问题可能来自何处,或者我如何缩小它?

我认为问题在于:当您在命令行上运行程序时,system()命令通过shell(cmd.exe);当您在其他地方运行程序时,它不会。不幸的是,这两种方法处理命令行参数的方式不同


根据我的经验,这种东西在窗户里是一团糟。我在Perl中也遇到过这个问题。

我认为问题在于:当您在命令行上运行程序时,system()命令通过shell(cmd.exe);当您在其他地方运行程序时,它不会。不幸的是,这两种方法处理命令行参数的方式不同


根据我的经验,这种东西在窗户里是一团糟。我在Perl中也遇到了这个问题。

尝试通过
printf“%d”,$?>>8
。然后检查是否为您的程序记录了此代码,以及它的实际含义。确保您的程序位于
PATH
如果您不在命令行
print“$ENV{PATH}\n”
我检查了它,返回代码不属于该程序。我的程序不需要位于
路径
,因为我显式地调用了它(请参阅上面的绝对路径调用)。我现在还检查了
$?
中的任何其他数据,即信号(
$?&127
)和转储(
$?&128
),但两者都报告了
0
。此外,我尝试在没有任何参数的情况下调用该程序,因此我确切地知道它将在哪里退出,但它没有。另外,我检查了,没有返回
53
的退出函数,也没有返回源代码中任何地方的编号
53
。因此,当组合导致错误时,程序无法正确执行…请尝试通过
printf“%d”,$?>>8
。然后检查是否为您的程序记录了此代码,以及它的实际含义。确保您的程序位于
PATH
如果您不在命令行
print“$ENV{PATH}\n”
我检查了它,返回代码不属于该程序。我的程序不需要位于
路径
,因为我显式地调用了它(请参阅上面的绝对路径调用)。我现在还检查了
$?
中的任何其他数据,即信号(
$?&127
)和转储(
$?&128
),但两者都报告了
0
。此外,我尝试在没有任何参数的情况下调用该程序,因此我确切地知道它将在哪里退出,但它没有。另外,我检查了,没有返回
53
的退出函数,也没有返回源代码中任何地方的编号
53
。因此,虽然这种组合会导致错误,但程序无法正确执行……问题是:这在其他非常类似的系统上也能工作,只是在我的系统上不行。此外,这不是引用问题,因为所有路径都被正确引用,不需要转义任何内容,所以您的链接没有帮助。对不起,问题是:这在其他非常相似的系统上也能工作,只是在我的系统上不行。此外,这不是引用问题,因为所有路径都被正确引用,不需要转义任何内容,所以您的链接没有帮助。很抱歉
perl script.pl