@在Windows 7中使用ActivePerl时ARGV为空
我有以下Perl脚本。我正在尝试使用ActivePerl在Windows 7中运行它:@在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];
#!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