4

perl プログラムからシステム コマンドを実行しようとしています。

「指定されたパスが見つかりません」と表示された場合、パスを指定しない限り問題なく動作します。

exec()、system()、またはバックティックで同じ結果が得られます。

コマンド文字列を直接引数として使用するか、一重引用符または二重引用符で囲まれた文字列に入れてその文字列を引数として渡すことで、同じ結果が得られます。

動作しないコマンドを perl スクリプトからコピーして DOS ボックスに貼り付けると、動作し、その逆も同様です。

例えば、

print `cd`;

正常に動作しますが、

print `cd \`;

print `cd ..`;

同じエラー メッセージが表示されます。

$cmd = 'foo.htm'; $ret=`$cmd`

ブラウザを起動しますが、

$cmd = '\foo.htm'; $ret=`$cmd`;

ではない。

問題が何であるかについて誰か提案がありますか?

4

1 に答える 1

3

あなたのシステムコマンドが何であるか、そしてあなたが得ているものを教えていただければ助かります. あなたのエラーが何であるかを言うのは少し難しいです。しかし、私は推測します..

Windows 上で を実行している場合は、バックスラッシュ文字がPerlの特殊な引用文字\であることを理解する必要があります。実際のバックスラッシュを使用するには、2 倍にする必要があります。

 system ("C:\\Program Files (x86)"\\Microsoft Office\\Word.exe");

または、Perl に付属のFile::Specモジュールを使用することをお勧めします。これにより、正しいパス構造を作成することが保証されます。

use File::Spec::Functions;

my $executable = catfile("C:", "Program Files (X86)",
      "Microsoft Office", "Word.exe");
system ($executable);

もちろん、systemコマンドの出力をキャプチャして、エラーがあるかどうかを確認する必要があります。

my $error = system($executable);
if ($error) {
      if ($? == -1) {
          print "Program failed to execute\n";
      }
      else {
          my $signal = ($? & 127);
          my $exit_code = ($? >> 8);
          print "Error: Signal = $signal  Exit Code = $exit_code\n";
      }
}
于 2012-07-18T00:41:09.670 に答える