如何在Windows上的Perl中访问带有空格的路径?

时间:2011-01-04 19:17:50

标签: windows perl

我正在将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。

4 个答案:

答案 0 :(得分:5)

您正在引用整个命令,包括命令行参数。您应该在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'

答案 1 :(得分:2)

你也必须逃离这些空间。

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

答案 2 :(得分:2)

它是Perl,所以有1000种方式(如你所见),单向(逃避空间)

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

答案 3 :(得分:1)

我的解决方案是这样做:

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

<强>更新 我也注意到,@ mob正确地指出我的\"在错误的地方。 DOS二十五年,我想念:/