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

时间:2012-07-26 14:20:34

标签: 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 "$line\n";
    }
close FH;

命令如下:

$cmd = '"C:\path\to\sscep.exe" getca -f "C:\path\to\config\capi_sscep.cnf"'

即使创建一个只执行此命令的小测试脚本,只有从命令行运行才能正常工作。

系统

  • Windows x64
  • Active Perl v5.16.0,MSWin32-x64-multi-thread
  • Eclipse Juno 20120614-1722

什么有效

我的工作是打开一个管理员提示符(脚本执行所必需的)和:

perl script.pl

输出打印到屏幕,$?0

什么不起作用

启动Eclipse并使用相同的perl script.pl调用运行调试会话。 同样无效的是添加服务并执行命令(使用Win32 :: Daemon创建)。守护进程本身工作正常,并按预期启动perl脚本。只有命令不会被执行。 $? 1356853如果与$? >> 8一起转移,则不会打印输出。退出代码不属于该程序。

进一步详情

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

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

这个问题可能来自哪些想法或者我怎么可能缩小它?

1 个答案:

答案 0 :(得分:0)

以下是我认为存在的问题:当您在命令行上运行程序时,system()命令会通过shell(cmd.exe);当你在其他地方运行你的程序时,它没有。不幸的是,这两个方法处理命令行参数的方式不同Here is an article that seems like it should help you solve the problem

根据我的经验,这种事情在Windows中是一团糟。我在Perl中也遇到过这个问题。