在 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] 时,$filenameundef,所以我收到了警告。

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

【问题讨论】:

对,这真的很奇怪,因为我刚刚在我的 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,您应该可以在命令行上使用assocftype。事实上,如果你输入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 命令,您可能有 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

如果您懒惰且信任他人,可以尝试将其用作 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 中使用命令提示符的消息

在 Windows 7 中使用 Open MPI 和 CUDA

无法在 Windows 7 中使用 Python 启动 PhantomJS

在 Windows 7 中使用 REN 批量重命名文件(添加前缀)

我在 python3.7/Windows 7 中编写的 Python 程序无法在 Windows XP 中运行

如何在 Windows 7 中使用 Nodejs? [关闭]