当我在Windows环境中调用Perl脚本而没有首先调用perl
时,参数没有传递给我的脚本。
例如,
C:\> C:\my-perl-scripts\foo.pl bar
调用foo.pl
但不将bar
识别为参数(@ARGV
为空)。但是,
C:\> perl C:\my-perl-scripts\foo.pl bar
工作正常。
这是配置问题吗?
理想情况下,我希望能够分发一些perl脚本,让用户将C:\my-perl-scripts\
添加到路径中,然后在运行cmd时能够从任何地方调用foo.pl
。
如果他们必须首先指定perl,那么他们将总是必须给予一个完整的路径。
有什么想法或建议吗?
**Edit:**为了显示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:\>
我包括了t和www.example.com的输出t.pl,以表明这不是%PATHEXT%问题。
我不知道下一步该去哪里找,但是谢谢你到目前为止的建议,它们很有帮助。
**编辑2:**问题似乎出在我的vista商务机上。在我的xp pro机上,它和预期的一样工作。两者都有ActivePerl 5.8.9。我还有另一个vista家庭机,我还没有试过。如果我发现什么,我会发回。
**编辑3:**我找到了答案(如下所示)。我通过运行注册表清理程序,删除Perl,再次运行注册表清理程序找到了答案。在第二次清理时,只剩下一个无效条目--导致问题的条目(可能是上次安装时留下的)。
9条答案
按热度按时间dohp0rv51#
虽然ftype和assoc的值是按照建议设置的,但我的系统上的实际行为似乎是由注册表项决定的
它的
(Default)
字符串值应为"C:\Perl\bin\perl.exe" "%1" %*
当我发现这个条目时,它被设置为
"C:\Perl\bin\perl.exe" "%1"
。更改它立即修复了这个问题。我不知道也许是以前安装的
无论如何,谢谢你的建议,我希望这个答案也能帮助到其他人。
irtuqstp2#
嗯......听起来 *.pl的文件关联有点混乱。我没有使用Windows系统,所以无法测试。您可以在命令行上使用
ASSOC
或FTYPE
命令检查文件关联。IIRC,“ASSOC .pl
“应该告诉你 * 文件类型 * 是什么,“FTYPE
filetype**command”告诉shell如何处理Perl脚本。请尝试以下操作:从one of the command references的外观来看,应该可以做到这一点。我的猜测是,当前的关联没有将参数沿着给脚本。您应该能够通过使用
ASSOC .pl
来确定文件关联的名称,然后使用FTYPE
打印出shell将要执行的命令来检查这一点。更新
我发现了一个有趣的事情,我想为后代做个记录。我在一台朋友机器上看到了这个问题,关于一些Python脚本。
ASSOC
和FTYPE
产生了预期的输出,但是参数仍然没有被沿着正是最初报告的。经过一段时间的挖掘,我发现注册表设置被创建为
REG_SZ
值。我删除了它们,并使用ASSOC
和FTYPE
重新创建了它们,一切都开始工作了...查看注册表后,我得到了答案**新值被创建为REG_EXPAND_SZ
!**这些工作完全符合预期。w6lpcovy3#
**更新:**如果以下内容是正确的,则唯一需要确保的是没有关闭命令扩展。请尝试:
cmd /e:on
在命令行中输入。另请参阅Windows XP cmd documentation:
启用和禁用命令扩展
默认情况下,Windows XP中的命令扩展是启用的。可以使用/e:off为特定进程禁用命令扩展。可以通过设置下列
REG_DWORD
值,为计算机或用户会话上的所有cmd命令行选项启用或禁用扩展:HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions\REG_DWORD
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions\REG_DWORD
使用Regedit.exe将注册表中的REG_DWORD值设置为
0x1
(即启用)或0x0
(即禁用)。用户指定的设置优先于计算机设置,命令行选项优先于注册表设置。第一个
自2004年以来,我几乎使用了每一个ActiveStatePerl发行版。这些设置足以使它工作。
slwdgvem4#
总而言之。
ftype是旧的,cmd.exe不关心它说什么。
真实的重要的是HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\命令。
只需运行:
reg add HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\command /ve /d "C:\strawberry\perl\bin\perl.exe \"%1\" %*" /f
然后一切都会好起来。(* 假定“C:\strawberry\perl\bin\perl. exe”是Perl安装的确切路径。*)
/ve是用来行程de“(预设)”REG_SZ值/d是将“data”指派给“value”/f以胁迫取代(或覆写)先前存在的值
事实上,如果
assoc .pl=Whatever
和ftype Whatever
不存在(从不给它们赋值,或者执行ftype Whatever=
来取消赋值),那么脚本仍然可以在不预先添加perl.exe
的情况下被调用。所以,如果使用Windows 6.0(Vista,2008,7等),就忘记assoc和ftype命令的存在。不用麻烦了。去reg.exe!
pwuypxnk5#
我尝试更新
.pl
并将其与注册表中的许多不同的PERL条目相关联,其他人也尝试过(.pl
、Perl
、PerlScript
、pl_auto_file
、Applications\perl.exe
),但这些都不起作用。我在Windows 7上运行的是Perl 5.14.2。然后我注意到注册表中有一个\Applications\perl5.14.2.exe
条目,它被设置为:添加了
%*
,然后我就可以看到@ARGV
中的数据了。我还注意到,在其中一些条目上,我有一个命令路径条目
"C"\Perl64\..."
,它来自以前安装的64位PERL,当我发现64位PERL在IIS 7上不如32位PERL时,我就卸载了它。因此,有一些悬挂的安装残余物可能也会影响事情。所以这里的答案可能不短,用简单的话来说就是...“这取决于...”(取决于您的系统和安装)。
polkgigr6#
修复文件关联问题后,无法传递参数。我支持的一个用户在首次尝试从(Windows 7 Professional)命令行运行脚本后,错误地将.pl文件扩展名与记事本关联。尝试了所有文件关联技巧和环境变量修复程序,但均无效。已卸载并重新安装,并尝试了32位和64位安装。此问题仅出现在用户配置文件中。
最后进入注册表并简单地从中删除项
HKEY_CLASSES_ROOT\应用程序\perl.exe\shell\打开\命令
***并通过***重新添加
如果您有任何问题,请在下面的命令行中输入您的密码。
***又开始传递参数了***谢谢“lucretius”
mi7gmzs67#
我在注册表中发现了这个额外的位置,必须先更新它才能为我工作。注意:HKEY_USERS后面的名称在您的计算机上可能不同。
将%* 添加到默认字符串:
如果您有任何问题,请单击“确定”。
7qhs6swi8#
原作者的答案是可行的。这里有一个完整的注册表文件,用于在Windows上手动安装PERL,只需添加到PATH环境变量:“;C:\PERL\bin;“并使用记事本创建一个包含以下内容的perl.reg文件:
tzdcorbm9#
我在Windows2016上安装了Perl 5.24.3,发现JAMS调度程序代理Shell忽略了.pl扩展名,就像它不存在一样。从DOS桌面上看一切都很好。在Winows2008上的相同配置工作正常。由ActiveState Perl安装创建的注册表项,与上面的Lucretius Post匹配,但不全局应用于所有用户。例如,不是默认的系统用户。以Shell将运行的用户身份登录,并进行关联会有所帮助。
理想情况下,应该有一个注册表分支来使.pl assoc全局化。