4

C# プログラムから perl スクリプトを呼び出せるように、次のコードを動作させようとしています。XP Service Pack3 で Visual stdio 2008 を使用して開発しています。

 myProcess = new Process();
        ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("perl.exe");
        myProcessStartInfo.Arguments = @"C:\Documents and Settings\test_perl.pl";
        myProcessStartInfo.UseShellExecute = false;
        myProcessStartInfo.RedirectStandardOutput = true;
        myProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        myProcessStartInfo.CreateNoWindow = true;
        myProcess.StartInfo = myProcessStartInfo;

        myProcess.Start();
        string output = myProcess.StandardOutput.ReadToEnd();
        MessageBox.Show(output);
        myProcess.WaitForExit();

test_perl.pl が存在することを確認し、perl.exe を notepad.exe に変更すると、上記のコードが機能します。しかし、perl.exe を使用すると、メッセージ ボックスが空になります。

なぜこれが間違っているのか理解できません。理由がわかる方教えてください。

ありがとう

4

2 に答える 2

6

perl.exe は、コマンド ラインでスペースを含む引用符で囲まれていないパスを処理できますか? パスを引用してみてください:

myProcessStartInfo.Arguments = @"""C:\Documents and Settings\test_perl.pl""";

コマンド ライン引数はスペースで区切られているため、ファイル パスが引用符で囲まれていない限り、アプリケーション (この場合は perl.exe) には 3 つの引数が表示されます。

  1. C:\ドキュメント
  2. 設定\test_perl.pl

Perl は、ファイル "C:\Documents" を開こうとする可能性があります。もちろん、これは存在しません。解決策は、スペースを含むファイル パス (または一貫性を保つためにすべてのファイル パス) を引用することです。

notepad.exe は、引用符で囲まれていないファイル パスを適切に処理すると述べています。おそらく、それは単なるメモ帳が平均的なクマよりも賢く、その引数をマージしてくれるだけです。

もちろん、そのパスにファイルが存在することを確認してください。これは、実際には少し変わった方法です。通常、ユーザー ファイルはC:\Documents and Settings\myusername\Documents\file.extなどに表示されます。

于 2009-10-20T05:21:07.007 に答える
0

perl はあなたの中にあります%PATH%か? コマンド プロンプトを開き、「perl -v」と入力します。

于 2009-10-20T05:09:57.543 に答える