在Windows 7中使用ActivePerl时@ARGV为空

时间:2010-11-20 19:36:10

标签: perl windows-7 command-line-arguments activeperl

我有以下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

首先,当我print @ARGV时,没有任何内容被打印,其次,当我分配$filename = $ARGV[0]时,$filenameundef,所以我得到了警告。

那么......我做错了什么?为什么不将命令行参数传递给脚本?

4 个答案:

答案 0 :(得分:31)

正如其他人指出perl blah.pl asdf有效,而blah.pl asdf失败。这是因为当你直接运行perl脚本时,Windows意识到它必须调用perl,并使用规则perl "%1",它只将脚本名称传递给perl,而不是任何参数。

要解决此问题,您必须告诉窗口使用规则perl "%1" %*

如何做到这一点可能有点单调乏味:

选项1

根据perlmonks,您应该可以在命令行上使用assocftype。实际上,如果您键入help ftype,它会告诉您如何设置perl:

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

运行assoc要求cmd在Window 7上以管理员运行。

然而,这对我不起作用。 Windows忽略了该关联。我不得不修改注册表。这可能是由于在Win 7上运行Default Programs实用程序的错误建议,它允许您指定用于给定文件扩展名的程序。 与XP 不同,这将允许您指定多个命令选项(将在右键单击菜单中使用) - 它将仅 允许您指定双击文件时使用的程序(或从命令行运行foo.pl)。

选项2

修改注册表:HKEY_CLASSES_ROOT

如果您使用了assoc / ftype命令,则可能包含perlPerlScript的条目。正如我先前所说,这些将被忽略。查找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

如果您懒惰且信任,可以尝试将其用作注册文件,并将其导入注册表:

Windows Registry Editor Version 5.00

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

这足以使blah.pl asdf起作用。

答案 1 :(得分:7)

我遇到了问题,如果我在Win7上执行:

perl myprog.pl a b c  

程序正确地获取了参数(在@ARGV中),但是如果我执行了:

myprog.pl a b c 

程序不会收到参数。

我在网上搜索了一个解决方案,很快发现它不是ActiveState perl问题,但更可能是Windows(Win7)中的文件类型关联问题,(感谢PerlMonks网站)。

然而所有解决方案都在改变

assoc .pl=Perl  

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

没有为我解决这个难题。我注意到不会以某种方式使用assoc .pl,因为如果我添加了.plx = Perl并将我的程序重命名为myprog.plx

myprog.plx a b c 

工作得很好!

那么我在微软论坛上看到这个问题是Win7“功能”默认程序被提到,我找到了我的问题的解决方案:

单击“开始”按钮打开“默认程序”,然后单击“默认程序”。

选择“将文件类型或协议与程序关联”并选择“.pl”并单击“更改程序”。已经有一个Perl命令行解释器被指定为推荐程序,但我点击浏览并自己选择了Perl.exe。关闭“关联文件类型...”屏幕后,

myprog.pl a b c 

像魅力一样执行,我的程序正确检索了所有参数。

希望有帮助...

答案 2 :(得分:2)

Windows 8.1中的Perl ARGV问题解决方案:

  

HKEY_CLASSES_ROOT \ Applications \ perl.exe \ shell \ open \ command =   “C:\ Perl \ bin \ perl.exe”“%1”%*

不需要重新启动。

答案 3 :(得分:-3)

我很确定Windows 7不了解shebang系列。使用perl run_mp3splt.pl a运行此操作会发生什么?