2014-01-14 28 views
2

我在的Windows: - /在我的劇本我:perl的,如果(-e「與空間路徑窗口){}

$ENV{'Powmig Path'}powermt 

這給我:

C:\Program\ Files\EMC\PowerPath\powermt 

如果我做一個if(-e $ENV{'Powmig Path'}powermt)這是行不通的。

我必須嘗試改變一些替代\/

我的路3210

我也嘗試添加更多的雙引號,但似乎沒有:-(

爲例工作:

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::Spec; 

if($^O =~ m/^MSWin32$/){ 
    my $tmp = File::Spec->catdir($ENV{'Powmig Path'}, "powermt"); 
    if(-e "\"$tmp\""){ 
     print "powermt found\n"; 
    }else{ 
     print "No multipathing found \"$tmp\"\n"; 
    } 
    $tmp =~ s/\\/\//g; 
    if(-e "\"$tmp\""){ 
     print "powermt found\n"; 
    }else{ 
     print "No multipathing found \"$tmp\"\n"; 
    } 
}else{ 
    print "Error: Unknow OS\n"; 
} 
exit; 

輸出:

C:\Users\sgargasson\Desktop>perl test.pl 
No multipathing found "C:\Program Files\EMC\PowerPath\powermt" 
No multipathing found "C:/Program Files/EMC/PowerPath/powermt" 

經過一番嘗試用不同的文件,問題從空間來...

有人可以幫助我嗎?

THX在進階

+1

也許你應該包括您使用的實際*代碼*。我在文件測試中使用'-e'命令沒有問題,它們在windows中有空格。你的問題很可能僅僅是你的代碼出了問題。 – TLP

+2

此外,永遠不會包含近似代碼。總是包含你自己使用的代碼,它描述了你確切的問題。 – TLP

+0

re:編輯:在你改變它之前,你還沒有對字符串進行'-e'文件測試。兩部分:1)您正在使用'-x'文件測試。 2)你在更改字符串之後正在進行文件測試。 – TLP

回答

5

你一定要明白,你不能只輸入一個字符串轉換的源代碼,對不對?你需要引用它:

print "$ENV{'Powmig Path'}powermt"; 
... 
if (-e "$ENV{'Powmig Path'}powermt") 

這將從哈希%ENV插值變量,在這種情況下的哈希值,並以字符串powermt拼接它。

而如果你試圖連接一個字符串變量,首先需要引用它,然後使用operator將其連接到變量:

my $string = $ENV{'Powmig Path'} . "powermt"; 
#        ^--- concatenation operator 

如果你正在試圖建立路徑,不過,你可能會使用適合的模塊爲任務,如File::Spec

use strict; 
use warnings; 
use File::Spec; 

my $path = File::Spec->catdir($ENV{'Powmig Path'}, "powermt"); 
+0

我試着用concat和File :: Spec,不是更好:-( –

+0

這樣做。'使用Data :: Dumper; $ Data :: Dumper :: Useqq = 1; print Dumper $ path;系統(「目錄」,$路徑);'看看你有任何隱藏的空白字符錯誤,並看看你的shell是否可以找到與dir的文件 – TLP

+0

我做我的$路徑= $ ENV {'Powmig路徑'}; OUTPUT :$ VAR1 =「C:\\ Program Files \\ EMC \\ PowerPath \\」;在顯示目錄後 –

0

這裏有一個問題:

if(-e "\"$tmp\""){ 

你有一套額外的引號。文件名不是"C:\Program Files\whatever",它是C:\Program Files\whatever。如果文件名被命令提示符解釋,或者類似的東西,你只需要那些額外的引號,這裏就不是這種情況。

試試這個,在這裏我已經去除了多餘的引號("\"$tmp\""變得"$tmp",這是完全一樣$tmp):

if (-e $tmp) { 
+0

這只是一個嘗試。你可以用我的答案大聲笑: - / –

1

由於很多TLP

我好一個愚蠢的Linux用戶!

問題:

my $tmp="$ENV{'Powmig Path'}powermt"; 

解決方法:

my $tmp="$ENV{'Powmig Path'}powermt.exe"; 

正確的代碼:

#!/usr/bin/perl 
use strict; 
use warnings; 

if($^O =~ m/^MSWin32$/){ 
    if(-e "$ENV{'Powmig Path'}powermt.exe"){ 
     print "powermt found\n"; 
    }else{ 
     print "No multipathing found\n"; 
    } 
}else{ 
    print "Error: Unknow OS\n"; 
} 
exit; 

我很愚蠢的,我需要取消選中 「隱藏擴展名知道」 這麼多在這件事情小時...