我在@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)?提前谢谢。
答案 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)
或者您可以像以前建议的那样使用-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的解决方案。我刚发布这个作为概念证明(我认为这是正确的术语)。