Windows 如何让Perl理解如何导航到路径中有空格的目录?
我试图导航到一个目录,在那里我存储了我的函数,我需要在脚本中使用它来生成结果。但我被卡住了,因为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
$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
的变量中很奇怪。因此,博罗丁的答案更好。