如何使Perl脚本识别Win32 cmd控制台中的命令行参数?

hof1towb  于 2022-11-15  发布在  Perl
关注(0)|答案(9)|浏览(197)

当我在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,再次运行注册表清理程序找到了答案。在第二次清理时,只剩下一个无效条目--导致问题的条目(可能是上次安装时留下的)。

dohp0rv5

dohp0rv51#

虽然ftype和assoc的值是按照建议设置的,但我的系统上的实际行为似乎是由注册表项决定的

HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\command

它的(Default)字符串值应为"C:\Perl\bin\perl.exe" "%1" %*
当我发现这个条目时,它被设置为"C:\Perl\bin\perl.exe" "%1"。更改它立即修复了这个问题。
我不知道也许是以前安装的
无论如何,谢谢你的建议,我希望这个答案也能帮助到其他人。

irtuqstp

irtuqstp2#

嗯......听起来 *.pl的文件关联有点混乱。我没有使用Windows系统,所以无法测试。您可以在命令行上使用ASSOCFTYPE命令检查文件关联。IIRC,“ASSOC .pl“应该告诉你 * 文件类型 * 是什么,“FTYPEfiletype**command”告诉shell如何处理Perl脚本。请尝试以下操作:

C:\> ASSOC .pl=perlscript
C:\> FTYPE perlscript=C:\Perl\bin\perl.exe %1 %*

one of the command references的外观来看,应该可以做到这一点。我的猜测是,当前的关联没有将参数沿着给脚本。您应该能够通过使用ASSOC .pl来确定文件关联的名称,然后使用FTYPE打印出shell将要执行的命令来检查这一点。

更新

我发现了一个有趣的事情,我想为后代做个记录。我在一台朋友机器上看到了这个问题,关于一些Python脚本。ASSOCFTYPE产生了预期的输出,但是参数仍然没有被沿着正是最初报告的
经过一段时间的挖掘,我发现注册表设置被创建为REG_SZ值。我删除了它们,并使用ASSOCFTYPE重新创建了它们,一切都开始工作了...查看注册表后,我得到了答案**新值被创建为REG_EXPAND_SZ!**这些工作完全符合预期。

w6lpcovy

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发行版。这些设置足以使它工作。

slwdgvem

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=Whateverftype Whatever不存在(从不给它们赋值,或者执行ftype Whatever=来取消赋值),那么脚本仍然可以在不预先添加perl.exe的情况下被调用。
所以,如果使用Windows 6.0(Vista,2008,7等),就忘记assoc和ftype命令的存在。不用麻烦了。去reg.exe!

pwuypxnk

pwuypxnk5#

我尝试更新.pl并将其与注册表中的许多不同的PERL条目相关联,其他人也尝试过(.plPerlPerlScriptpl_auto_fileApplications\perl.exe),但这些都不起作用。我在Windows 7上运行的是Perl 5.14.2。然后我注意到注册表中有一个\Applications\perl5.14.2.exe条目,它被设置为:

"C:\Perl\bin\perl5.14.2.exe" "%1"

添加了%*,然后我就可以看到@ARGV中的数据了。
我还注意到,在其中一些条目上,我有一个命令路径条目"C"\Perl64\...",它来自以前安装的64位PERL,当我发现64位PERL在IIS 7上不如32位PERL时,我就卸载了它。因此,有一些悬挂的安装残余物可能也会影响事情。
所以这里的答案可能不短,用简单的话来说就是...“这取决于...”(取决于您的系统和安装)。

polkgigr

polkgigr6#

修复文件关联问题后,无法传递参数。我支持的一个用户在首次尝试从(Windows 7 Professional)命令行运行脚本后,错误地将.pl文件扩展名与记事本关联。尝试了所有文件关联技巧和环境变量修复程序,但均无效。已卸载并重新安装,并尝试了32位和64位安装。此问题仅出现在用户配置文件中。

最后进入注册表并简单地从中删除项

HKEY_CLASSES_ROOT\应用程序\perl.exe\shell\打开\命令

***并通过***重新添加

如果您有任何问题,请在下面的命令行中输入您的密码。

***又开始传递参数了***谢谢“lucretius”

mi7gmzs6

mi7gmzs67#

我在注册表中发现了这个额外的位置,必须先更新它才能为我工作。注意:HKEY_USERS后面的名称在您的计算机上可能不同。
将%* 添加到默认字符串:
如果您有任何问题,请单击“确定”。

7qhs6swi

7qhs6swi8#

原作者的答案是可行的。这里有一个完整的注册表文件,用于在Windows上手动安装PERL,只需添加到PATH环境变量:“;C:\PERL\bin;“并使用记事本创建一个包含以下内容的perl.reg文件:

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\.pl]
[HKEY_CLASSES_ROOT\.pl]
@="Perl"
"PerceivedType"="text"
[HKEY_CLASSES_ROOT\.pl\Perl]
[HKEY_CLASSES_ROOT\.pl\Perl\ShellNew]
[HKEY_CLASSES_ROOT\.pl\PersistentHandler]
@="{5e941d80-bf96-11cd-b579-08002b30bfeb}"

[HKEY_CLASSES_ROOT\Applications\perl.exe]
[HKEY_CLASSES_ROOT\Applications\perl.exe\shell]
[HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open]
[HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

[HKEY_CLASSES_ROOT\Perl]
[HKEY_CLASSES_ROOT\Perl\shell]
[HKEY_CLASSES_ROOT\Perl\shell\Open]
[HKEY_CLASSES_ROOT\Perl\shell\Open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

[HKEY_CLASSES_ROOT\pl_auto_file]
@=""
[HKEY_CLASSES_ROOT\pl_auto_file\shell]
[HKEY_CLASSES_ROOT\pl_auto_file\shell\open]
[HKEY_CLASSES_ROOT\pl_auto_file\shell\open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

[HKEY_CURRENT_USER\Software\Classes\Applications\perl.exe]
[HKEY_CURRENT_USER\Software\Classes\Applications\perl.exe\shell]
[HKEY_CURRENT_USER\Software\Classes\Applications\perl.exe\shell\open]
[HKEY_CURRENT_USER\Software\Classes\Applications\perl.exe\shell\open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pl]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pl]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pl\OpenWithList]
"a"="perl.exe"
"MRUList"="ab"
"b"="NOTEPAD.EXE"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pl\OpenWithProgids]
"pl_auto_file"=hex(0):
"Perl"=hex(0):

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Perl]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Perl\shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Perl\shell\Open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Perl\shell\Open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file]
@=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell\open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell\open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

[HKEY_LOCAL_MACHINE\SOFTWARE\Perl]
@="C:\\PERL\\"
"BinDir"="C:\\Perl\\bin\\perl.exe"
tzdcorbm

tzdcorbm9#

我在Windows2016上安装了Perl 5.24.3,发现JAMS调度程序代理Shell忽略了.pl扩展名,就像它不存在一样。从DOS桌面上看一切都很好。在Winows2008上的相同配置工作正常。由ActiveState Perl安装创建的注册表项,与上面的Lucretius Post匹配,但不全局应用于所有用户。例如,不是默认的系统用户。以Shell将运行的用户身份登录,并进行关联会有所帮助。
理想情况下,应该有一个注册表分支来使.pl assoc全局化。

相关问题