9

次のPerlスクリプトがあります。ActivePerl を使用して Windows 7 で実行しようとしています。

#!c:\Perl64\bin\perl.exe -w

use strict;

my $mp3splt_exe = 'c:\Program Files (x86)\mp3splt\mp3splt.exe';

my $mp3splt_args = '-o "@n @f" -g "r%[@o @N]"  -f -t 6.0';

print @ARGV;
my $filename = $ARGV[0];

print "$mp3splt_exe $mp3splt_args $filename\n";

(ご覧のとおり、mp3splt のラッパーを作成しようとしています :-) )

次のように実行すると:

C:\Program Files (x86)\mp3splt>run_mp3splt.pl a

私はこれを得る:

Use of uninitialized value $filename in concatenation (.) or string at C:\Program Files (x86)\mp3splt\run_mp3splt.pl line 12.
c:\Program Files (x86)\mp3splt\mp3splt.exe -o "@n @f" -g "r%[@o @N]"  -f -t 6.0

したがって、まず、 I の場合print @ARGVは何も出力されず、次に、 as を代入$filename = $ARGV[0]すると$filenameisundefになるため、警告が表示されます。

それで...私は何を間違っていますか?コマンドライン パラメータがスクリプトに渡されないのはなぜですか?

4

4 に答える 4

32

他の人が指摘しているように、うまくいきませんがperl blah.pl asdfblah.pl asdf失敗します。これは、perl スクリプトを直接実行すると、Windows が perl を呼び出す必要があることを認識しperl "%1"、スクリプト名のみを perl に渡し、パラメーターを渡さないというルールを使用するためです。

これを修正するには、ウィンドウにルールを使用するように指示する必要がありますperl "%1" %*

その方法は少し面倒かもしれません:

オプション1

perlmonksによると、コマンドラインassocで andを使用できるはずですftype。実際、 と入力help ftypeすると、perl のセットアップ方法が表示されます。

assoc .pl=PerlScript
ftype PerlScript=perl.exe %1 %*

実行するには、Windows 7で管理者としてコマンドを実行assocする必要があります。

しかし、これは私にはうまくいきませんでした。Windows は関連付けを無視しました。レジストリを変更する必要がありました。Default Programsこれは、特定のファイル拡張子に使用するプログラムを指定できる、Win 7 でユーティリティを実行するという誤ったアドバイスが原因である可能性があります。XP とは異なり、複数のコマンド オプション (右クリック メニューで使用)を指定することはできませ。ファイルをダブルクリックする (または foo を実行する) ときに使用されるプログラムのみを指定できます。コマンドラインから .pl)。

オプション 2

レジストリを変更します。 HKEY_CLASSES_ROOT

assoc/ftype コマンドを使用したことがある場合は、perlまたはのエントリがある可能性がありますPerlScript。前述のとおり、これらは無視されます。を探してpl_auto_file、次の場所までドリルダウンしますcommand

HKCR\pl_auto_file\shell\open\command

ここでは、次の(Default)ように設定する必要があります。 "C:\Perl\bin\perl.exe" "%1"

%*その最後に欠けているものを追加すると、準備完了です。"C:\Perl\bin\perl.exe" "%1" %*

再起動は必要ありません。

オプション 3

あなたが怠け者で信頼しているなら、これを reg ファイルとして使用し、レジストリにインポートしてみてください:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\pl_auto_file\shell\open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

これは、作業を行うのに十分なはずblah.pl asdfです。

于 2011-09-14T01:38:25.687 に答える
7

Win7で実行した場合、次の問題が発生しました。

perl myprog.pl a b c  

プログラムは (@ARGV で) パラメーターを正しく取得しましたが、実行した場合:

myprog.pl a b c 

プログラムはパラメーターを受け取りません。

Web で解決策を検索したところ、ActiveState perl の問題ではなく、Windows (Win7) でのファイルタイプの関連付けの問題である可能性が高いことがすぐにわかりました (PerlMonks Web サイトに感謝します)。

ただし、すべてのソリューションが

assoc .pl=Perl  

そしてその

ftype Perl="C:\Perl\bin\perl.exe" "%1" %* 

私のためにパズルを解決しませんでした。assoc .plx=Perl を追加してプログラムの名前を myprog.plx に変更したため、assoc .pl が使用されていないことに気付きました。

myprog.plx a b c 

完璧に機能しました!

それで、Microsoftフォーラムでこの問題を読んで、Win7の「機能」デフォルトプログラムが言及されていたので、問題の解決策を見つけました:

[スタート] ボタン をクリックして既定のプログラムを開き、[既定のプログラム] をクリックします。

「ファイルの種類またはプロトコルをプログラムに関連付ける」を選択し、「.pl」を選択して「プログラムの変更」をクリックします。推奨プログラムとして指定された Perl コマンド ライン インタープリターが既にありましたが、代わりに [参照] をクリックして自分で Perl.exe を選択しました。「ファイルの種類を関連付ける...」画面を閉じた後、

myprog.pl a b c 

チャームのように実行され、すべてのパラメーターがプログラムによって正しく取得されました。

それが役立つことを願っています...

于 2012-10-11T12:10:57.167 に答える
-3

I'm pretty sure Windows 7 doesn't understand the shebang line. What happens if you run this with perl run_mp3splt.pl a?

于 2010-11-20T19:44:54.740 に答える