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

@在Windows 7中使用ActivePerl时ARGV为空,perl,windows-7,command-line-arguments,activeperl,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];

我有以下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:\ProgramFiles(x86)\mp3splt>run\u 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]
时,
$filename
undef
,因此我得到了警告


所以。。。我做错了什么?为什么命令行参数没有传递给脚本?

我很确定Windows 7不理解shebang行。如果使用
perl run_mp3splt.pl a
运行该程序会发生什么情况?

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

要解决此问题,您必须告诉windows使用规则
perl“%1”%*

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

选项1

根据,您应该能够在命令行上使用
assoc
ftype
。事实上,如果您键入
help ftype
,它会告诉您如何设置perl:

assoc .pl=PerlScript
ftype PerlScript=perl.exe %1 %*
要运行
assoc
,需要在窗口7上以管理员身份运行cmd

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

选项2

修改注册表:
HKEY\U CLASSES\U ROOT

如果使用了assoc/ftype命令,则可能有
perl
PerlScript
的条目。正如我前面所说,这些将被忽略。查找
pl\u auto\u文件
,并深入到
命令

HKCR\pl_auto_file\shell\open\command
这里的
(默认值)
应该设置为如下内容:
“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
工作

我遇到了一个问题,如果我在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并没有以某种方式被使用,因为如果我添加assoc.plx=Perl并将我的程序重命名为myprog.plx

myprog.plx a b c 
工作得很好

于是我在微软论坛上读到了这个问题,如果提到Win7“功能”默认程序,我找到了解决问题的方法:

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

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

执行得像个符咒,我的程序正确地检索到了所有参数


希望这有助于解决Windows 8.1中的Perl ARGV问题:

HKEY\U CLASSES\U ROOT\Applications\perl.exe\shell\open\command= C:\Perl\bin\Perl.exe“%1”*


无需重新启动。

Shebang不可能是问题所在。Windows使用扩展关联。ActiveState安装程序将“.pl”文件与perl相关联。对,这真的很奇怪,因为我刚刚在我的Win7机器上运行了这个代码段,并且它确实工作了。您使用的是什么版本的perl?您是否安装了适用于Windows 7的perl?还要尝试运行这个perl-e“print@ARGV”aaaa,看看是否有任何输出,如果没有,那么perl安装肯定有问题。如果这样做,脚本中可能会有一些冲突,请检查声明变量的范围等。这里的关键是显式浏览和选择exe。我花了几个小时查看我的设置,一切似乎都正常。我这样做了,效果非常好!谢谢此外(对于选项2和3),可能存在一个现有的每个用户密钥,该密钥将覆盖此位置。例如:HKEY\U用户\S-X-X-XX-XXXXXXX-XXXXXX-xxxxx\Software\Classes\pl\u自动文件。我建议完全删除此密钥,并使用选项2或选项3中的密钥。但是,您也可以只编辑此键(然后更改将仅适用于您的用户)。
myprog.pl a b c