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"
.立即更改它解决了问题.
为什么一开始就这样设置?我不知道.也许来自之前的装置?
无论如何,感谢您的建议,我希望这个答案也可以帮助其他人.
嗯......听起来像*.pl的文件关联以某种方式搞砸了.我不在Windows机器上,所以我无法测试.您可以使用命令行上的ASSOC
或FTYPE
命令检查文件关联内容.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脚本相关的问题. ASSOC
并FTYPE
产生了预期的产量,但参数仍未传递 - 正是最初报道的内容.
经过一番挖掘后,我发现注册表设置是作为REG_SZ
值创建的.我删除它们并重新使用它们创建ASSOC
和FTYPE
一切开始工作...查看注册表给我的答案,新的数据被创建为REG_EXPAND_SZ
! 这些完全符合预期.