在 Windows 7 中使用 ActivePerl @ARGV 为空
Posted
技术标签:
【中文标题】在 Windows 7 中使用 ActivePerl @ARGV 为空【英文标题】:@ARGV is empty using ActivePerl in Windows 7 【发布时间】:2011-05-13 04:26:11 【问题描述】:我有以下 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
,所以我收到了警告。
那么...我做错了什么?为什么没有将命令行参数传递给脚本?
【问题讨论】:
对,这真的很奇怪,因为我刚刚在我的 Win7 机器上运行了 sn-p,它确实有效。您使用的是哪个版本的 perl,您是否为 Windows 7 安装了合适的版本?也尝试运行这个 perl -e "print @ARGV" aaaa 看看你是否得到任何输出,如果你没有,那么你的 perl 安装肯定有问题。如果你这样做了,你可能在脚本中有一些冲突,检查声明变量的范围等。 【参考方案1】:正如其他人指出的那样,perl blah.pl asdf
有效,而 blah.pl asdf
失败。这是因为当你直接运行 perl 脚本时,Windows 意识到它必须调用 perl,并使用规则 perl "%1"
,它只将脚本名称传递给 perl,而不传递任何参数。
要解决此问题,您必须告诉 Windows 使用规则 perl "%1" %*
如何做到这一点可能有点乏味:
选项 1
根据perlmonks,您应该可以在命令行上使用assoc
和ftype
。事实上,如果你输入help ftype
,它会告诉你如何设置perl:
assoc .pl=PerlScript
ftype PerlScript=perl.exe %1 %*
要运行assoc
,需要在 Window 7 上以 administrator 身份运行 cmd。
但是,这对我不起作用。 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
如果您懒惰且信任他人,可以尝试将其用作 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
工作。
【讨论】:
另外(对于选项 2 和 3),可能有一个现有的每用户密钥将覆盖此位置。如:HKEY_USERS\S-X-X-XX-XXXXXXX-XXXXXX-XXXXXXX-XXXX\Software\Classes\pl_auto_file。我建议完全删除此密钥,并使用选项 2 或选项 3 中的那个。但是,您也可以只编辑此密钥(然后更改仅适用于您的用户)。【参考方案2】:如果我在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 命令行解释器被指定为推荐程序,但我点击了浏览并自己选择了 Perl.exe。关闭“关联文件类型...”屏幕后,
myprog.pl a b c
像魅力一样执行,我的程序正确检索了所有参数。
希望对您有所帮助...
【讨论】:
这里的关键是明确地浏览和选择你的 exe。我花了几个小时检查我的设置,一切似乎都正确。我做到了,而且效果很好!谢谢!【参考方案3】:Windows 8.1中Perl ARGV问题解决方案:
HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\command = "C:\Perl\bin\perl.exe" "%1" %*
无需重新启动。
【讨论】:
【参考方案4】:我很确定 Windows 7 不理解 shebang 行。如果你用perl run_mp3splt.pl a
运行它会发生什么?
【讨论】:
社帮不是问题。 Windows 使用扩展关联。 ActiveState 安装程序将“.pl”文件与 perl 相关联。以上是关于在 Windows 7 中使用 ActivePerl @ARGV 为空的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 7 中使用 Open MPI 和 CUDA
无法在 Windows 7 中使用 Python 启动 PhantomJS
在 Windows 7 中使用 REN 批量重命名文件(添加前缀)