我有以下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]
时,$filename
是undef
,所以我得到了警告。
那么......我做错了什么?为什么不将命令行参数传递给脚本?
答案 0 :(得分:31)
正如其他人指出perl blah.pl asdf
有效,而blah.pl asdf
失败。这是因为当你直接运行perl脚本时,Windows意识到它必须调用perl,并使用规则perl "%1"
,它只将脚本名称传递给perl,而不是任何参数。
要解决此问题,您必须告诉窗口使用规则perl "%1" %*
如何做到这一点可能有点单调乏味:
选项1
根据perlmonks,您应该可以在命令行上使用assoc
和ftype
。实际上,如果您键入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命令,则可能包含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
如果您懒惰且信任,可以尝试将其用作注册文件,并将其导入注册表:
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
运行此操作会发生什么?