代码之家  ›  专栏  ›  技术社区  ›  Keith Bentrup

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

  •  6
  • Keith Bentrup  · 技术社区  · 15 年前

    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\ 到路径,然后就可以调用 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:\>
    

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

    我不知道下一步该去哪里看,但是谢谢你的建议。他们帮了大忙。

    编辑2:

    编辑3:

    8 回复  |  直到 15 年前
        1
  •  18
  •   Keith Bentrup    15 年前

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

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

    (Default) 字符串值 "C:\Perl\bin\perl.exe" "%1" %*

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

    一开始为什么会这样?我不知道。可能是以前安装的?

    无论如何,谢谢你的建议,我希望这个答案也能帮助其他人。

        2
  •  9
  •   D.Shawley    15 年前

    六羟甲基三聚氰胺六甲醚。。。听起来*.pl的文件关联不知怎么搞砸了。我不在Windows机箱上,因此无法测试此功能。您可以使用 ASSOC FTYPE ASSOC .pl 文件类型 是和“ 文件类型 告诉shell如何使用Perl脚本。尝试以下方法:

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

    one of the command references 这应该能奏效。我的猜测是,当前关联没有将参数传递给脚本。您应该能够通过使用 助理法律顾问 F型

    更新

    我发现了一件有趣的事,我想给子孙后代记下来。关于一些Python脚本,我开始在friends机器上看到这个问题。 F型 这正是最初报道的情况

    经过一番挖掘,我发现注册表设置是沿着这条线创建的 REG_SZ 价值观我删除了它们,并使用 协会 F型 一切都开始起作用了。。。看了一下登记册,我得到了答案 新值创建为 REG_EXPAND_SZ !

        3
  •  2
  •   Sinan Ünür    15 年前

    鉴于以下内容是正确的,唯一需要确保的是命令扩展没有关闭。尝试:

    cmd /e:on

    在运行测试之前,请在命令行上单击。另见 Windows XP cmd documentation :

    默认情况下,Windows XP中会启用命令扩展。您可以使用/e:off为特定进程禁用它们。通过设置以下选项,可以启用或禁用计算机或用户会话上所有cmd命令行选项的扩展 REG_DWORD 价值观:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions\REG_DWORD

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions\REG_DWORD

    将REG_DWORD值设置为 0x1 0x0 使用Regedit.exe在注册表中禁用。用户指定的设置优先于计算机设置,命令行选项优先于注册表设置。

    E:\Temp> assoc .pl
    .pl=Perl
    
    E:\Temp> ftype Perl
    Perl="C:\opt\Perl\bin\perl.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'
    

    自2004年以来,我几乎使用了所有ActiveState Perl发行版。这些设置足以让它正常工作。

        4
  •  2
  •   lucretius    14 年前

    总而言之。

    真正的交易是HKEY_CLASSES\u ROOT\Applications\perl.exe\shell\open\command。

    只需运行: reg add HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\command /ve /d "C:\strawberry\perl\bin\perl.exe \"%1\" %*" /f

    一切都会好起来的假设“C:\草莓\perl\bin\perl.exe”是perl安装的确切路径。*)

    /d是将数据分配给值 /f强制替换(或覆盖)先前存在的值

    事实上,如果 assoc .pl=Whatever ftype Whatever ftype Whatever= 要取消分配),仍可以调用脚本,而无需预先结束 perl.exe .

        5
  •  0
  •   memowe    12 年前

    .pl , Perl PerlScript , pl_auto_file , Applications\perl.exe \Applications\perl5.14.2.exe 并将其设置为:

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

    %* 这样我就可以看到数据了 @ARGV .

    我还注意到,在其中一些条目上,我有一个命令路径条目 "C"\Perl64\..." 以前安装的64位PERL,当我发现64位PERL在IIS 7中不如32位PERL好时,我将其卸载。因此,存在悬而未决的安装遗留问题,可能也会影响到其他方面。

    因此,这里的答案可能不是一个简短的答案,而是用简单的话来回答……”这取决于…(取决于您的系统和安装)。

        6
  •  0
  •   solo    11 年前

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

    最后进入注册表并简单地从

    HKEY\U CLASSES\U ROOT\Applications\perl.exe\shell\open\command

    并通过

    reg add HKEY_CLASSES\u ROOT\Applications\perl.exe\shell\open\command/ve/d“C:\草莓\perl\bin\perl.exe\%1\“%*”/f

    再次开始传递参数 谢谢“lucretius”

        7
  •  0
  •   Roy Fulbright    8 年前

    我在注册表中找到了这个额外的位置,在它对我起作用之前必须进行更新。注意:HKEY_用户后的名称在您的计算机上可能不同。


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


    HKEY_用户\S-1-5-21-1399284159-2775065347-350672949-4058_类\pl_自动_文件\shell\open\command D:\Perl\bin\Perl.exe“%1”*

        8
  •  0
  •   isidroco    6 年前

    原作者答作品。这里有一个完整的注册表文件,用于在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"
    
        9
  •  0
  •   Alex Taylor    5 年前

    Winows2008上的相同配置工作正常。 以Shell运行的用户身份登录,并使关联得到帮助。