如何让Perl脚本识别Win32 cmd控制台中的参数?

Kei*_*rup 6 scripting perl winapi cmd

当我在Windows环境中调用我的Perl脚本而不perl先调用时,参数不会传递给我的脚本.

例如,

C:\> C:\my-perl-scripts\foo.pl bar
Run Code Online (Sandbox Code Playgroud)

调用foo.pl但不识别bar为参数(@ARGV为空).然而,

C:\> perl C:\my-perl-scripts\foo.pl bar
Run Code Online (Sandbox Code Playgroud)

按预期工作.

这是配置问题吗?

理想情况下,我希望能够分发一些perl脚本,让用户添加C:\my-perl-scripts\到路径,然后只需能够foo.pl在运行cmd时从任何地方调用.

如果他们必须首先指定perl,那么他们将始终必须提供完整的路径.

任何想法或建议?

编辑:为了显示我的系统上的assoc和ftype是正确的,我执行了以下命令.

C:\>assoc .pl
.pl=Perl

C:\>ftype Perl
Perl="C:\Perl\bin\perl.exe" "%1" %*

C:\>more t.pl
print "'$_'\n" for @ARGV;

C:\>t a b

C:\>perl t.pl a b
'a'
'b'

C:\>t.pl a b

C:\>
Run Code Online (Sandbox Code Playgroud)

我包括了t和t.pl的输出,以表明它不是%PATHEXT%问题.两者都没有像最初描述的那样输出,而调用perl首先给出了预期的响应.

我不知道下一步该去哪看,但感谢到目前为止的建议.他们非常乐于助人.

编辑2:问题似乎出现在我的vista业务框中.在我的XP专业版盒子上,它按预期工作.两者都有ActivePerl 5.8.9.我还有另一个尚未尝试的远景家用盒子.如果我发现任何事情,我会回复.

编辑3:我找到了答案(发布在下面).我通过运行注册表清理程序,删除perl,再次运行注册表清理程序找到它.在第二次清理时,只剩下一个无效条目 - 导致问题的条目(可能是以前的安装遗留下来的).

Kei*_*rup 17

我发现了问题所在.虽然ftype和assoc值是按照建议设置的,但我系统上的实际行为似乎是由注册表项确定的

HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\command
Run Code Online (Sandbox Code Playgroud)

它应该有一个(Default)字符串值"C:\Perl\bin\perl.exe" "%1" %*

当我找到这个条目时,它被设置为"C:\Perl\bin\perl.exe" "%1".立即更改它解决了问题.

为什么一开始就这样设置?我不知道.也许来自之前的装置?

无论如何,感谢您的建议,我希望这个答案也可以帮助其他人.


D.S*_*ley 8

嗯......听起来像*.pl的文件关联以某种方式搞砸了.我不在Windows机器上,所以我无法测试.您可以使用命令行上的ASSOCFTYPE命令检查文件关联内容.IIRC," ASSOC .pl"应该告诉你文件类型是什么," FTYPE filetype 命令 "告诉shell如何处理Perl脚本.尝试类似的东西:

C:\> ASSOC .pl=perlscript
C:\> FTYPE perlscript=C:\Perl\bin\perl.exe %1 %*
Run Code Online (Sandbox Code Playgroud)

其中一个命令引用的外观来看,应该可以解决这个问题.我的猜测是当前关联没有将参数传递给脚本.您应该能够通过ASSOC .pl确定文件关联的名称来检查它,然后使用FTYPE打印出shell将要执行的命令.

更新

我发现了一个有趣的事情,我想为后代注意.我开始在一些朋友的机器上看到与某些Python脚本相关的问题. ASSOCFTYPE产生了预期的产量,但参数仍未传递 - 正是最初报道的内容.

经过一番挖掘后,我发现注册表设置是作为REG_SZ值创建的.我删除它们并重新使用它们创建ASSOCFTYPE一切开始工作...查看注册表给我的答案,新的数据被创建为REG_EXPAND_SZ! 这些完全符合预期.