PowerShell哈希表和输出到文本文件

时间:2014-07-30 10:47:18

标签: powershell hashtable

我在@Ansgar的帮助下编写了一个脚本。下面是脚本的代码。该脚本检查远程计算机的Ping,RDP,远程注册表和WMI检查。服务器名称输入文本文件servernames.txt执行脚本后,UP的服务器记录在名为Online.txt的文本文件中,DOWN的服务器记录在Offline.txt中。记录的格式为下面:

ONLINE.TXT

<servername>

PING             :    SUCCESS
RDP              :    SUCCESS
Remote Registry  :    SUCCESS
WMI              :    SUCCESS

OFFLINE.TXT

<servername>

PING             :    SUCCESS
RDP              :    FAIL
Remote Registry  :    SUCCESS
WMI              :    SUCCESS

这是我到目前为止的剧本:

#Text file to pick the server names. Path is hard coded to c:\temp\serverlist.txt
$servers = Get-Content "C:\temp\serverlist.txt"

ForEach ($server in $servers)
{

   Write-Host `n
   Write-Host $server
   Write-Host `n

   #PING
   $ping = Test-Connection -ComputerName $server -Quiet -Count 1

   #RDP
   $rdp  = Test-NetConnection -ComputerName $server -CommonTCPPort RDP -InformationLevel Quiet

   #REMOTE REGISTRY
   $regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey   ([Microsoft.Win32.RegistryHive]::LocalMachine,$server)
   $ref = $regkey.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")

   #WMI
   $wmi  = Get-WmiObject -Query "Select * from Win32_PingStatus where Address = '$server'"

   $state_noun = @{
      $true  = 'SUCCESS'
      $false = 'FAIL'
   }

   $state_verb = @{
      $true  = 'SUCCEEDED'
      $false = 'FAILED'
   }

   $result = @"
      PING             :    $($state_noun[$ping])
      RDP              :    $($state_noun[$rdp])
      Remote Registry  :    $($state_noun[[bool]$ref])
      WMI              :    $($state_noun[[bool]$wmi])

"@ 
}

如何将服务器及其结果输出到文本文件(online.txt和offline.txt)?提前谢谢。

2 个答案:

答案 0 :(得分:0)

使用-and计算4次检查的总体结果:

$ping -and $rdp -and [bool]$ref -and [bool]$wmi

-and运算符仅在两个操作数均为true时返回true,因此上述语句仅在所有4个检查都成功时才变为true。

根据布尔运算的结果写入一个或另一个输出文件:

if ($ping -and $rdp -and [bool]$ref -and [bool]$wmi) {
  $result | Out-File 'C:\path\to\online.txt' -Append
} else {
  $result | Out-File 'C:\path\to\offline.txt' -Append
}

答案 1 :(得分:0)

或者您可以像以前建议的那样使用-Co​​ntains运算符,只需执行以下操作:

If(@($state_noun[$ping],$state_noun[$rdp],$state_noun[[bool]$ref],$state_noun[[bool]$wmi]) -contains "FAIL"){
    $result | Out-File 'C:\path\to\online.txt' -Append
}else{
    $result | Out-File 'C:\path\to\offline.txt' -Append
}

虽然我个人会使用Ansgar Wiechers的解决方案。我刚发布这个作为概念证明(我认为这是正确的术语)。