2017-06-01 49 views
1

我正在嘗試訪問服務器並獲取它的名稱,但它不可用如何處理錯誤並繼續執行其餘腳本。如果此命令返回qx($srvername)一個錯誤我想退出for無法獲取錯誤並檢查它是否存在

my @s =qw(v200 pm363 wq280); 
foreach $a (@s){ 

    eval { 
    my $srvername="wmic /node: '$a' computersystem get Name"; 
    my $opt = qx($srvername) ; 

    if($!){ 
    next; 
    } 
}; 


print "here$a\n"; 
} 
+2

'$?'([$ CHILD_ERROR](http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR))給出了狀態。如果一切順利,它應該是零。閱讀[在perlvar](http://perldoc.perl.org/perlvar.html#Error-Variables) – zdim

回答

1

,如果你想使用它,你需要聲明eval塊之外的$opt變量。您還需要在eval塊之外執行next

我已經改變了你的代碼周圍的一堆東西。

我們現在聲明$opt$srvername以外的eval。最好將eval的範圍儘可能小,並且創建一個字符串不會失敗。

我們隨後致電qx()eval的,並分配$opt,這是foreach塊內部作用域。這樣你可以在之後訪問它。

如果qx失敗,我們die,它突破eval塊。如果您關心qx投擲的錯誤,則可以投擲$?

eval之後我們檢查了[email protected],這個保存了eval錯誤。如果有東西在那裏(可能是我們從qx$?),我們轉到next迭代。

my @s = qw(v200 pm363 wq280); 
foreach my $node (@s){ 
    my $opt; 
    my $srvername = "wmic /node: '$node' computersystem get Name"; 

    eval { 
    $opt = qx($srvername) or die $?; 
    }; 

    next if [email protected]; 

    print "$node - opt\n"; 
} 

請注意,我也改名爲$a$node。變量名稱$a$b一起保留用於sort。給變量賦予有意義的名稱也是一個好主意。

相關問題