Windows 如何让Perl理解如何导航到路径中有空格的目录?

Windows 如何让Perl理解如何导航到路径中有空格的目录?,windows,perl,debugging,path,Windows,Perl,Debugging,Path,我试图导航到一个目录,在那里我存储了我的函数,我需要在脚本中使用它来生成结果。但我被卡住了,因为Perl无法理解我的函数位置语法(带空格) 这是我的密码: $path ="D:\\AVI MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck"; $snmpwalk = `$path\\SnmpWalk.exe -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9`; prin

我试图导航到一个目录,在那里我存储了我的函数,我需要在脚本中使用它来生成结果。但我被卡住了,因为Perl无法理解我的函数位置语法(带空格)

这是我的密码:

$path ="D:\\AVI MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck";

$snmpwalk = `$path\\SnmpWalk.exe -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9`;
print "$snmpwalk";
其中SnmpWalk是我的函数,位于变量$path中的path

Perl在运行时返回以下错误:

D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\SnmpCheck>perl perl_snmpwalk_v2.0.pl
'D:\AVI' is not recognized as an internal or external command,
operable program or batch file.

如何解决此问题?

不是Perl不理解您的路径,而是
cmd
(Windows shell)。我认为,通过在你的路径周围添加一些引号,可以解决这个问题。请尝试以下不太优雅的破解方法:

$executable ="\"D:\\AVI MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck\\SnmpWalk.exe\"";

$snmpwalk = `$executable -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9`;
print "$snmpwalk";

在Linux/OSX上,用
\
转义空白。在Windows上,在路径周围使用引号

Linux/OSX:

$escapedPath ="D:\\AVI\ MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck";
窗口:

$escapedPath ="\"D:\\AVI MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck"\";

另外,请注意。

明智地使用正确的引号,这可以整理很多。单引号内的反斜杠不需要转义,除非它们是字符串中的最后一个字符,而双引号仅在用作字符串分隔符时才需要转义。打印时将
$snmpwalk
加引号也是错误的(几乎可以肯定)

my $path = 'D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\SnmpCheck';

my $snmpwalk = `"$path\\SnmpWalk.exe" -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9`;

print $snmpwalk;

在Perl中,可以使用
q{string}
代替
'string'
(助记符单引号),也可以使用
qq{string}
代替
“string”
(助记符双引号)。双引号计算变量和反斜杠,而单引号不计算。另外,可以使用
qx{cmd}
代替
`cmd`
中的反勾号(助记符引号和执行)

使用这些结构可以更容易地在类似您的情况下转义字符串:

my $snmpwalk = q{"D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\SnmpCheck\snmpwalk"};
my $result = qx{$snmpwalk -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9};
print $result;

还要注意,即使在Windows下,也可以在路径中使用前斜杠(
/
)。只要您对可执行文件使用完整路径,它就可以正常工作。

我使用它来检查在Cygwin上运行的Perl中的.jar文件的内容:

#!/bin/perl

$file = q{"C:\cygwin\home\lylez\Hadoop\hadoop-2.x\hadoop-2.2.0\share\hadoop\yarn\hadoop-yarn-api-2.2.0.jar"};
$path = '/cygdrive/c/Program Files/Java/jdk1.7.0_45/bin';

@result = qx{"$path\\jar" -tf $file 2>&1};

for my $result ( @result )
{
    chomp $result;
    print $result, "\n";
}

如果我没弄错的话,只有在*nix操作系统上,您才可以转义路径中的空格。您试图使其理解的是
cmd
,而不是
perl
。这是
cmd
返回的错误。感谢ikegami改进我的问题:)这不是黑客;这实际上是你必须要做的。这是初稿中的一个漏洞,因为第一句话被添加在第一行,第二句,在第二行。此外,还可以通过使用
而不是周围的引号来进一步美化解决方案,从而避免转义反斜杠的需要双引号仅用于在运行命令时转义空格。它们不是可执行路径本身的一部分。所以把它们放在名为
$executable
的变量中很奇怪。因此,博罗丁的答案更好。