1

私はWindows でmrを使用しており、リポジトリ アクションの前後に任意のコマンドを実行できます。私が見る限り、これは単に perl のsystem関数を呼び出すことによって行われます。ただし、私の設定には何か問題があるようです: mr を作成するとき、d にある次のバッチ ファイルを実行します。

@echo off
copy /Y foo.bat bar.bat

最も基本的な Windows コマンドでエラーが発生します。

d:/foo.bat: line 1: @echo: command not found
d:/foo.bat: line 2: copy: command not found

mr が問題ではないことを確認するために実行しましperl -e 'system( "d:/foo.bat" )'たが、出力は同じです。

コピーの代わりに xcopy を使用すると、出力が現在

d:/foo.bat: line 1: @echo: command not found
Invalid number of parameters

ただし、パラメーターの何が問題なのかわかりません。おそらく問題は、バッチファイルが標準コマンド環境に完全にアクセスできないことだと考えたので、明示的に実行しようとしましperl -e 'system( "cmd /c d:\foo.bat" )'たが、cmdを開始するだけでコマンドを実行しません(コマンドラインを終了して、私がいた場所)。

ここで何が問題なのですか?詳細な説明は素晴らしいでしょう。また、これを解決するにはどうすればよいですか?バッチファイルをそのままにしておくソリューションを好みます。

4

1 に答える 1

3

echo ディレクティブは、実行中のコマンド プロンプト インスタンスによって直接実行されます。しかし、perl はあなたのコマンドで新しいプロセスを起動しています。これらのコマンドを機能させるには、cmd インスタンス内でスクリプトを実行する必要があります。

あなたcmd /cは働かなければなりません。提供しているパスにスペースがあるかどうかを確認してください。引数を渡すパラメータ化された方法を使用できます。

@array = qw("/c", "path/to/xyz.bat");
system("cmd.exe", @array);

echo ディレクティブは実行可能ファイルではないため、エラーが発生します。copyコマンドも同様です。実行可能ファイルではありませんが、実行可能ファイルxcopy.exeです。

于 2013-01-31T09:24:33.927 に答える