【问题标题】:PowerShell hash table and output to text filesPowerShell 哈希表并输出到文本文件
【发布时间】:2014-07-30 10:47:17
【问题描述】:

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

在线.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)?提前谢谢你。

【问题讨论】:

  • 使用&gt;Out-File
  • @Raf 我可以让 Out-File 工作,但是如何将 FAIL 状态服务器重定向到 Offline.txt 并将 SUCCESS 状态服务器重定向到 Online.txt?我是哈希表概念的新手。
  • 我只是尝试了这个逻辑,它没有将结果写入文件: If($result -contains 'FAIL') { $result |输出文件 c:\temp\offline.txt } elseif($result -contains 'SUCCESS') { $result |输出文件 c:\temp\online.txt }
  • -contains 运算符与 string.Contains() 不同。 -contains 运算符用于了解集合是否具有某个元素(即@(1,2,3) -contains 3)。改用 $result.Contains('FAIL')。

标签: powershell hashtable


【解决方案1】:

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

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

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

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

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
}

【讨论】:

    【解决方案2】:

    或者您可以按照之前的建议使用 -Contains 运算符,然后执行以下操作:

    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 的解决方案。我只是将其发布为概念证明(我认为这是正确的术语)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 2018-01-22
      • 1970-01-01
      • 2018-11-09
      相关资源
      最近更新 更多