2012-12-06 30 views
2

我剛剛開始使用PowerShell和我有以下腳本:電源外殼多個WMI命令中的if語句

Get-ADComputer -Filter * | 

ForEach-Object { 

    if(Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet) 

    { 
    write-host $_.dnshostname 
    Get-WmiObject Win32_Process -cn $_.dnshostname | Select  ProcessID,ProcessName,ThreadCount 
    Get-WmiObject Win32_DiskDrive -cn $_.dnshostname; 
    } 



    ELSE { write-host $_.dnshostname unavlible } 

} 

基本上,我想實現的是從我的DC拉每臺計算機的列表,測試它們是否已啓動,然後使用多個WMI查詢輪詢它們。我遇到的問題是,當我對第一個Wmi對象進行選擇時,我沒有得到第二個wmi對象的結果,因爲我假設select將被應用於第二個對象,導致沒有數據被返回。

任何想法我可以做到這一點。現在我正在使用ping來測試機器的可用性,但這並不是最好的,因爲ICMP在某些系統上被阻塞,但WMI仍然是可能的。 ICMP同樣可用,但wmi被阻止。是否有更好的方法來執行測試以獲取WMI查詢將工作的系統列表?

回答

2

,我已經從PowerShell的第一版到第三版發現一個簡單的解決方法是這樣做的:

Get-ADComputer -Filter * |  
ForEach-Object {  
    if(Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet)  
    { 
    write-host $_.dnshostname 
    Get-WmiObject Win32_Process -cn $_.dnshostname | 
    Select ProcessID,ProcessName,ThreadCount 
    out-string -inputobject "" #this line does the trick or just out-default 
    Get-WmiObject Win32_DiskDrive -cn $_.dnshostname; 
    } 
    else { write-host "$($_.dnshostname) unavailable }  
} 

爲了測試可用性服務器我用this function它使用ping和其它協議,以查看服務器是否是,你需要只是一個true知道是否還活着。 (作爲系統管理員在某個域(不在DMZ域中)提示啓用icmp協議作爲第一診斷工具)