Powershell if语句中的多个WMIC命令

时间:2012-12-06 18:49:02

标签: powershell wmi

我刚开始使用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
   Get-WmiObject Win32_DiskDrive -cn $_.dnshostname;
   }



  ELSE { write-host $_.dnshostname unavlible }

}

基本上我想要实现的是从我的DC中提取每台计算机的列表,测试它们是否已启动,然后使用多个WMI查询轮询它们。我遇到的问题是,当我在第一个Wmi对象上进行选择时,我不会得到第二个wmi对象的结果,因为我假设select正在应用于第二个对象,导致没有数据被返回。

知道如何做到这一点。此外,我现在使用ping来测试机器的可用性,但这不是最好的,因为ICMP在某些系统上被阻止但WMI仍然可能。 ICMP可用但wmi被阻止也是如此。有没有更好的方法来执行获取WMI查询将起作用的系统列表的测试?

1 个答案:

答案 0 :(得分:2)

我从powershell v1到v3找到的一个简单的解决方法是:

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协议作为第一个诊断工具)