在Windows上使用Perl时,如何访问路径中带有空格的文件?

3

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

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

上面的代码会抛出以下错误:
“'C:\Program' 不是内部或外部命令,也不是可运行的程序或批处理文件。”
我尝试使用转义的 \" 包装,像这样:
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。


1
删除了我的答案,因为我无法让这该死的东西只用open就能工作,但是暂时这个应该可以解决问题:chdir q!C:/Program Files/MySQL/MySQL Server 5.1/bin!; open my $pipe, '|-', 'mysql.exe -u root -ppwd'; - Hugmeir
4个回答

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

你需要同样转义空格。

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

或者使用旧的8.3文件名

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

虽然如此,我不得不质疑使用MySQL客户端管道而不是直接使用DBI的理智。


2

这是Perl语言,所以有很多种方法(正如您将看到的那样)。其中一种方法是转义空格。

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

1
遗憾的是,那并不起作用。即使使用“”包装路径,它仍然会因为相同的错误而失败。 - Kev

1

我的解决方案是这样的:

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

更新: 我也注意到,正如@mob所指出的那样,我的\"放错了位置。25年的DOS经验,我居然犯了这个错误 :/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接