2012-01-19 12 views
2

私は定期的に再起動したいプログラムを実行しています。私はこの(Windowsの場合)を行うと

// Do stuff 
    . 
    . 
    exec $^X, $0, @ARGV; 

と$^Xは、それが複数の項目として$^Xを扱う上を使用して、スペースが含まれており、私は次のようにシェルが関与していないようにリストをexecし合格することを好みます失敗する。

以下の作品だけで罰金、しかし、スクリプトに加えて、サブシェルを起動する:

# Do stuff 
    . 
    . 
    exec "\"$^X\" $0 @ARGV" ; 

これは大きな問題ではありませんが、私は、可能な場合は、リストコンテキストで実行する方法を学習したいと思います。

物事は私が試してみました:また

exec "\"$^X\"", $0, @ARGV; 
    exec "\\\"$^X\\\"", $0, @ARGV; 
    exec "'$^X'", $0, @ARGV; # Even though Windows doesn't like ' 

push @restart, $^X, $0, @ARGV; 
    print $restart[0]; 
    exec @restart; 

print文は正しく配列の最初の項目として、その中のスペースで実行可能ファイルを示しています。

パスにスペースが含まれていない場所にperl実行可能ファイルをコピーしましたが、そこからはリストが動作しています。

答えて

1

Windowsファイルには、DOSの黄金時代との下位互換性のために、通常の名前と「短い」名前があります。具体的なケースが$^X = 'C:\Program Files\perl\perl.exeの場合、C:/Progra~1/perl/perl.exeのようなものがおそらく動作します。

もっと一般的な解決法については、Win32GetShortPathNameの機能を参照してください。そして、あなたは

exec Win32::GetShortPathName($^X), $0, @args; 

を呼び出すことができます(いくつかのケースであなたも、GetShortPathName$0と引数をラップすることをお勧めします)。

+0

それは動作します。早速のご返事ありがとうございます。 –

0

あなたは次のことを試しましたか?

exec $^X $0, @ARVG 

注:最初の引数の後にコンマはありません。それが機能する場合はexec PROGRAM LISTの特別な構文がある理由のためにperldoc -f execに問い合わせてください。

+0

私のために動作しません。私は上記の説明で十分に明確ではなかった。 $^Xが返す文字列には、C:¥Program Files¥perl¥perl.exeという空白が含まれています。 execはC:\ Programをプログラム名として解釈し、Files \ perl \ perl.exeを最初のパラメータとして解釈します。私は、新しいコマンドインタープリタを呼び出すスカラーコンテキストでexecを実行させるだけで、動作させることができます。 –

0

Windowsプログラムに引数を渡すことはできません。コマンドラインだけです。 (ええ、ひどいです)PerlとWindowのCreateProcessの両方で奇妙なものと組み合わさって、私たちはあらゆる種類の好奇心を抱いています。

私は、現時点ではWindows上ではないんだけど、私はあなたはそれがで動作するように得ることができると思う:

exec { $^X } "perl", $0, @ARVG 
関連する問題