PowerShell导出到CSV /工作stream?

当服务器进行ping操作时,为了使库存保持最新状态,将生成的地址与库存进行比较。

我试图在下一个相应的单元格上将结果作为“好”或“坏”来处理。 这种工作除了结果总是“坏”,我已经build立了工作stream程。

CSV包含从Excel清单中提取的服务器名称和IP地址,格式如下:

name,ipaddress server1,10.1.24.51 server2,10.1.24.52 server3,10.1.24.53 server4,10.1.27.101 server5,10.1.27.102 <--- purposely wrong IP address for testing 

当前脚本:

 $serverlist = Import-Csv -Path file.csv ForEach ($server in $serverlist) { $thisservername = $server.name $thisserveripaddress = $server.ipaddress $pingdaddress = (Test-Connection -ComputerName $thisservername -Count 1 -ErrorAction SilentlyContinue -Verbose).IPV4Address.IPAddressToString if ($pingdaddress -ne $thisserveripaddress) { #$thisservername + " bad" $serverlist | Select-Object name,ipaddress, @{Name='connection';Expression={'bad'}} | ` Export-Csv -Path file.csv -NoTypeInformation } else { #$thisservername + " good" $serverlist | Select-Object name,ipaddress, @{Name='connection';Expression={'good'}} | ` Export-Csv -Path file.csv -NoTypeInformation } } 

我认为你的错误源于$pingdaddress = (Test-Connection -ComputerName $thisservername -Count 1 -ErrorAction SilentlyContinue -Verbose).IPV4Address.IPAddressToString 。 如果服务器名称无法parsing, Test-Connection返回的连接对象(以及Win32_PingStatus对象)将为$null 。 然后你试图访问一个空对象的属性,这是不允许的。

我会把“成功”部分分成自己的专栏。 您可以通过在CSV中添加另一列来实现这一点,例如: NameMatchIPMatch ,对您来说更有意义。 这样你就可以作为你的循环$server.NameMatch一个属性来访问它,并在以后对数据进行过滤/sorting。

 function Test-ServerNameMapping { [cmdletBinding()] param( [Parameter(Mandatory=$true)] [ValidateScript({Test-Path $_})] [String] $Path ) $serverList = Import-Csv -Path $Path foreach ($server in $serverList) { Write-Verbose "Testing: $($server.Name), $($server.IPAddress)" $connectionObject = (Test-Connection -ComputerName $server.Name -Count 1 -ErrorAction SilentlyContinue) if (-not $connectionObject) { Write-Verbose "Failed to resolve $($server.Name) to an IP address." $server.namematch = $false } else { $resolvedAddress = $connectionObject.IPV4Address.ToString() Write-Verbose "Resolved $($server.Name) to $resolvedAddress" if ($resolvedAddress -eq $server.IPAddress) { Write-Verbose "$($server.IPAddress) matches found address of $resolvedAddress" $server.namematch = $true } else { Write-Verbose "$($server.IPAddress) does not equal found address of $resolvedAddress" $server.namematch = $false } } } $serverList | Export-Csv -Path $Path -NoTypeInformation -Force } 

那么如果你以后想制作一个报告,你可以这样做:

 $problemServers = Import-Csv -Path c:\example.csv | ? NameMatch -eq $false 

Example.csv:

 Name,IPAddress,NameMatch server1,10.0.0.1,"True" server2,10.0.0.2, server3,10.0.0.3,"False" 

当你第一次运行脚本时,NameMatch列可以是空的(就像server2一样),脚本将会填充它。