我正在将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。
答案 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二十五年,我想念:/