others - 脚本 - 在WIN32命令行控制台中,如何让Perl脚本识别参数?

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

例如,


C:> C:my-perl-scriptsfoo.pl bar



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


C:> perl C:my-perl-scriptsfoo.pl bar



按预期工作。

这是配置问题?

如果必须先指定perl,那么它们就必须给出完整的路径。

任何想法或建议?


C:>assoc .pl


.pl=Perl



C:>ftype Perl


Perl="C:Perlbinperl.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:>



时间:

我找到了问题出在哪儿了。尽管ftype和assoc值是按建议设置的,但是系统上的实际行为似乎是由注册表项决定的,


HKEY_CLASSES_ROOTApplicationsperl.exeshellopencommand



它的(Default)字符串值应该为"C:Perlbinperl.exe"" %1"%*

当我找到这个条目时,它被设置为"C:Perlbinperl.exe"" %1",更改它可以解决问题。

嗯,听起来*.pl的文件关联有点乱了,你可以使用命令行中的ASSOC或FTYPE命令来检查文件关联,IIRC , " ASSOC .pl "应该告诉你文件类型是什么,"FTYPE文件类型命令 "告诉shell应该怎样使用Perl脚本,尝试以下方法:


C:> ASSOC .pl=perlscript


C:> FTYPE perlscript=C:Perlbinperl.exe %1 %*



你应该可以通过使用ASSOC .pl来检查文件关联的名称,然后使用FTYPE打印shell将执行的命令。

尝试以下方法:

cmd /e:on

另请参阅Windows XP cmd文档

启用和禁用命令扩展

命令扩展在Windows XP中默认启用,你可以使用/e:off 来对特定进程禁用它们,通过设置以下REG_DWORD值来启用或禁用计算机或用户会话中所有cmd命令行选项的扩展:

HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorEnableExtensionsREG_DWORD

HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorEnableExtensionsREG_DWORD

使用Regedit.exe将REG_DWORD值设置为注册表中的0x1 (即已启用)或0x0 (就是被禁用了),用户指定的设置优先于计算机设置,命令行选项优先于注册表设置。

E:Temp> assoc .pl
.pl=Perl
E:Temp> ftype Perl
Perl="C:optPerlbinperl.exe""%1" %*
E:Temp> @echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PL;.PLX;.WPL;.py;.pyw
E:Temp> cat t.pl
print"'$_'n" for @ARGV;
E:Temp> t a b c d e f g h j
'a'
'b'
'c'
'd'
'e'
'f'
'g'
'h'
'j'

注意:HKEY_USERS之后的名称在你的计算机上可能有所不同。

将%*添加到默认字符串中:

HKEY_USERSS-1-5-21-1399284159-2775065347-350672949-4058_Classespl_auto_fileshellopencommand "D:Perlbinperl.exe" "%1" %*

";C:PERLbin ;制作一个包含包含以下内容的记事本的perl.reg文件:


Windows Registry Editor Version 5.00



[-HKEY_CLASSES_ROOT.pl]


[HKEY_CLASSES_ROOT.pl]


@="Perl"


"PerceivedType"="text"


[HKEY_CLASSES_ROOT.plPerl]


[HKEY_CLASSES_ROOT.plPerlShellNew]


[HKEY_CLASSES_ROOT.plPersistentHandler]


@="{5e941d80-bf96-11cd-b579-08002b30bfeb}"



[HKEY_CLASSES_ROOTApplicationsperl.exe]


[HKEY_CLASSES_ROOTApplicationsperl.exeshell]


[HKEY_CLASSES_ROOTApplicationsperl.exeshellopen]


[HKEY_CLASSES_ROOTApplicationsperl.exeshellopencommand]


@=""C:Perlbinperl.exe""%1" %*"



[HKEY_CLASSES_ROOTPerl]


[HKEY_CLASSES_ROOTPerlshell]


[HKEY_CLASSES_ROOTPerlshellOpen]


[HKEY_CLASSES_ROOTPerlshellOpencommand]


@=""C:Perlbinperl.exe""%1" %*"



[HKEY_CLASSES_ROOTpl_auto_file]


@=""


[HKEY_CLASSES_ROOTpl_auto_fileshell]


[HKEY_CLASSES_ROOTpl_auto_fileshellopen]


[HKEY_CLASSES_ROOTpl_auto_fileshellopencommand]


@=""C:Perlbinperl.exe""%1" %*"



[HKEY_CURRENT_USERSoftwareClassesApplicationsperl.exe]


[HKEY_CURRENT_USERSoftwareClassesApplicationsperl.exeshell]


[HKEY_CURRENT_USERSoftwareClassesApplicationsperl.exeshellopen]


[HKEY_CURRENT_USERSoftwareClassesApplicationsperl.exeshellopencommand]


@=""C:Perlbinperl.exe""%1" %*"



[-HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts.pl]


[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts.pl]


[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts.plOpenWithList]


"a"="perl.exe"


"MRUList"="ab"


"b"="NOTEPAD.EXE"


[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts.plOpenWithProgids]


"pl_auto_file"=hex(0):


"Perl"=hex(0):



[HKEY_LOCAL_MACHINESOFTWAREClassesPerl]


[HKEY_LOCAL_MACHINESOFTWAREClassesPerlshell]


[HKEY_LOCAL_MACHINESOFTWAREClassesPerlshellOpen]


[HKEY_LOCAL_MACHINESOFTWAREClassesPerlshellOpencommand]


@=""C:Perlbinperl.exe""%1" %*"



[HKEY_LOCAL_MACHINESOFTWAREClassespl_auto_file]


@=""


[HKEY_LOCAL_MACHINESOFTWAREClassespl_auto_fileshell]


[HKEY_LOCAL_MACHINESOFTWAREClassespl_auto_fileshellopen]


[HKEY_LOCAL_MACHINESOFTWAREClassespl_auto_fileshellopencommand]


@=""C:Perlbinperl.exe""%1" %*"



[HKEY_LOCAL_MACHINESOFTWAREPerl]


@="C:PERL"


"BinDir"="C:Perlbinperl.exe"



...