3

結果生成のためにスクリプトで使用する必要がある関数が保存されているディレクトリに移動しようとしています。しかし、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 のようにパスにある関数です。

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.

この問題を解決するにはどうすればよいですか?

4

5 に答える 5

6

正しい引用符を慎重に使用することで、これを大幅に整理できます。一重引用符内のバックスラッシュは、文字列の最後の文字でない限りエスケープする必要はありません。二重引用符は、文字列区切り文字としても使用されている場合にのみエスケープする必要があります。$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;
于 2013-01-02T18:17:46.033 に答える
5

Perlでは、 (ニーモニックの単一引用符) の代わりに、および(ニーモニックの二重引用符q{string}) の代わりに使用できます。二重引用符は変数とバックスラッシュを評価しますが、一重引用符は評価しません。また、(mnemonic quote and execute )でバッククォートの代わりに使用できます。'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 でもパスにスラッシュ ( ) を使用できること/に注意してください。実行可能ファイルにフルパスを使用する限り、問題なく動作します。

于 2013-01-03T04:02:30.420 に答える
4

Linux / OS Xでは、空白を。でエスケープします\。Windowsでは、パスを引用符で囲みます。

Linux / OS X:

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

ウィンドウズ:

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

こちらもご覧ください。

于 2013-01-02T10:19:10.703 に答える
1

パスを理解していないのは Perl ではなく、cmd(Windows シェル) です。パスに引用符を追加すると、この問題が解決すると思います。次のあまりエレガントではないハックを試してください。

$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";
于 2013-01-02T10:16:43.057 に答える
0

これを使用して、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";
}
于 2013-12-10T03:59:00.340 に答える