2012-12-06 29 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协议作为第一诊断工具)