代码之家  ›  专栏  ›  技术社区  ›  Nathan Fellman

@在Windows 7中使用ActivePerl时argv为空

  •  9
  • Nathan Fellman  · 技术社区  · 15 年前

    我有以下Perl脚本。我正在尝试使用ActivePerl在Windows 7中运行它:

    #!c:\Perl64\bin\perl.exe -w
    
    use strict;
    
    my $mp3splt_exe = 'c:\Program Files (x86)\mp3splt\mp3splt.exe';
    
    my $mp3splt_args = '-o "@n @f" -g "r%[@o @N]"  -f -t 6.0';
    
    print @ARGV;
    my $filename = $ARGV[0];
    
    print "$mp3splt_exe $mp3splt_args $filename\n";
    

    (如您所见,我正在尝试为mp3splt创建一个包装器:-)

    当我这样运行它时:

    C:\程序文件(x86)\mp3splt>运行mp3splt.pl a

    我明白这一点:

    Use of uninitialized value $filename in concatenation (.) or string at C:\Program Files (x86)\mp3splt\run_mp3splt.pl line 12.
    c:\Program Files (x86)\mp3splt\mp3splt.exe -o "@n @f" -g "r%[@o @N]"  -f -t 6.0
    

    所以,首先,当我 print @ARGV ,什么都不打印,第二,当我分配 $filename = $ARGV[0] , $filename undef 所以我得到了警告。

    所以…我做错什么了?为什么不将命令行参数传递给脚本?

    4 回复  |  直到 12 年前
        1
  •  -3
  •   ennuikiller    15 年前

    我很肯定Windows7不理解shebang的意思。如果你用这个 perl run_mp3splt.pl a ?

        2
  •  31
  •   ikegami Gilles Quénot    12 年前

    正如其他人指出的那样 perl blah.pl asdf 作品,而 blah.pl asdf 失败。这是因为当您直接运行Perl脚本时,Windows意识到它必须调用Perl,并使用规则 perl "%1" 它只将脚本名传递给Perl,而不传递任何参数。

    修复这个 ,您必须告诉Windows使用规则 perl "%1" %*

    如何做到这一点可能有点乏味:

    选项1

    根据 perlmonks ,您应该能够使用 assoc ftype 在命令行上。事实上,如果你打字 help ftype ,它告诉您如何设置Perl:

    assoc .pl=PerlScript
    ftype PerlScript=perl.exe %1 %*
    

    运行 阿索克 需要命令运行方式 管理员 在7号窗口。

    但是,这对我不起作用。Windows忽略了关联。我不得不修改注册表。这可能是由于运行 Default Programs win 7上的实用程序,它允许您指定用于给定文件扩展名的程序。 不同于XP ,这将 允许您指定多个命令选项(在右键单击菜单中使用)--它将 只有 允许您指定双击文件(或从命令行运行foo.pl)时使用的程序。

    选项2

    修改注册表: HKEY_CLASSES_ROOT

    如果使用了assoc/ftype命令,则可以为 perl PerlScript . 如我之前所说,这些将被忽略。寻找 pl_auto_file 然后向下钻取到 command :

    HKCR\pl_auto_file\shell\open\command
    

    这里 (Default) 应该设置为: "C:\Perl\bin\perl.exe" "%1"

    添加缺失 %* 最后,你应该走了: "C:\Perl\bin\perl.exe" "%1" %*

    不需要重新启动。

    选项3

    如果您懒惰和信任,可以尝试将其用作注册表文件,并将其导入注册表:

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

    这应该足以使 一种新的方法 工作。

        3
  •  7
  •   Ashish Gupta Shiva    13 年前

    我有一个问题,如果我在Win7上执行:

    perl myprog.pl a b c  
    

    程序得到的参数(在@argv中)是正确的,但是如果我执行了:

    myprog.pl a b c 
    

    程序无法接收参数。

    我在网上搜索了一个解决方案,很快发现它不是ActiveState Perl问题,而是更可能是Windows(Win7)中的文件类型关联问题(这要归功于Perlmonks网站)。

    但是所有的解决方案都改变了

    assoc .pl=Perl  
    

    以及

    ftype Perl="C:\Perl\bin\perl.exe" "%1" %* 
    

    没有帮我解决这个难题。我确实注意到assoc.pl没有被使用,因为如果我添加assoc.plx=perl并将我的程序重命名为myprog.plx

    myprog.plx a b c 
    

    工作得很好!

    于是我在微软论坛上读到这个问题,如果提到了Win7的“功能”默认程序,我找到了解决我问题的方法:

    单击“开始”按钮打开默认程序,然后单击“默认程序”。

    选择“将文件类型或协议与程序关联”,然后选择“.pl”并单击“更改程序”。已经有一个指定为推荐程序的Perl命令行解释器,但是我单击了浏览并自己选择了perl.exe。关闭“关联文件类型…”屏幕后,

    MyPr.P.A.B.C
    

    所有参数都被我的程序正确地检索到了。

    希望有帮助…

        4
  •  2
  •   user987339 jbandi    12 年前

    Windows 8.1中的Perl argv问题解决方案:

    hkey_classes_root\applications\perl.exe\shell\open\command= “c:\perl\bin\perl.exe”“%1”%”*

    不需要重新启动。

    推荐文章