【问题标题】:How do I access paths with spaces in them in Perl on Windows?如何在 Windows 上的 Perl 中访问带有空格的路径?
【发布时间】:2011-01-04 19:17:49
【问题描述】:

我正在转换一个 Unix Perl 脚本以在 Windows 上运行。我遇到了包含空格的路径的问题:

open (IN, "| C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe -u root -ppwd") or die "$!";

上面的代码抛出如下错误:

'C:\Program' is not recognized as an internal or external command,

我尝试像这样包裹转义的\"

open (IN, "| \"C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe -u root -ppwd\"") or die "$!";

但没有快乐。如何处理带空格的路径?

我正在使用为 MSWin32-x86-multi-thread 构建的 ActiveState v5.10.0。

【问题讨论】:

  • 删除了我的答案,因为我无法打开该死的东西,但这暂时应该可以解决问题:chdir q!C:/Program Files/MySQL/MySQL Server 5.1/bin!; open my $pipe, '|-', 'mysql.exe -u root -ppwd';

标签: windows perl


【解决方案1】:

您引用了整个命令,包括命令行参数。您应该在mysql.exe 之后放置第二个转义引号:

open (IN, "| \"C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe\" -u root -ppwd") or die "$!";

您可能还对qq()q() 运算符感兴趣,它们允许您使用除引号之外的分隔符来分隔字符串。当您想要引用包含引号的字符串时,它们非常有用:

qq[| "C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe" -u root -ppwd]

此外,Perl 会很乐意为命令名称处理正确的路径分隔符(但并不总是用于命令参数,所以要小心):

qq[| "C:/Program Files/MySQL/MySQL Server 5.1/bin/mysql.exe" -u root -ppwd]

(由于此示例不需要任何插值,因此您可以使用单引号或 q() 构造:

'| "C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe" -u root -ppwd'

)

【讨论】:

    【解决方案2】:

    我的解决方案是这样做:

    $mysql = "C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.1\\bin\\mysql.exe";
    open (IN, "| \"$mysql\" -u root -ppwd") or die "$!";
    

    更新: 我还注意到,正如@mob 正确指出的那样,我的\" 放错了地方。 DOS 25 年,我很怀念:/

    【讨论】:

      【解决方案3】:

      它是 Perl,所以有 1000 种方式(如您所见),一种方式(逃避空格)

      open (IN, "| C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.1\\bin\\mysql.exe -u root -ppwd") or die "$!";
      

      【讨论】:

      • 很遗憾这不起作用。即使使用 \" 包装路径,它也会失败并出现相同的错误。
      【解决方案4】:

      你也必须避开空格。

      open (IN, "| C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.1\\bin\\mysql.exe -u root -ppwd") or die "$!";
      

      或者使用旧的8.3 names

      open (IN, "| C:\\Progra~1\\MySQL\\MySQL~1\\bin\\mysql.exe -u root -ppwd") or die "$!";
      

      不过,我不得不质疑通过管道传输 MySQL 客户端的合理性,而不仅仅是使用DBI

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        相关资源
        最近更新 更多