【问题标题】:Mass test-connection powershell大规模测试连接 powershell
【发布时间】:2018-09-06 12:54:30
【问题描述】:

好吧,我对 PowerShell 中的 Test-Connection 函数有疑问。 我有一个包含Server nameIPAddress 列的csv 文件。我需要使用服务器名称IPAddress结果等信息创建连接报告。如何添加有关列服务器名称的信息?

我当前的代码如下:

$Report = @()
$Servers = Import-CSV "C:\skrypt\bobi\servers.csv"  -Delimiter ';'
foreach ($Server in $Servers) {
    if ($Alive = Test-Connection -ComputerName $Server.IPAddress -Count 1 -quiet) {
        $TestResult = New-Object psobject -Property @{
            IPAddress = $Server.IPAddress
            Result    = "Online"
        }
    }
    else {
        $TestResult = New-Object psobject -Property @{
            IPAddress = $Server.IPAddress
            Result    = "Offline"
        }
    }
    $Report += $TestResult
}       
$Report | Select-Object IPAddress, Result | Export-Csv C:\skrypt\bobi\Report.csv -nti

【问题讨论】:

  • ServerName = $Server.ServerName 添加到psobject instatntiations 怎么样?
  • 哦,$Alive 已分配,但从未使用过
  • $Server."Server Name",如果列名包含空格。
  • @Clijsters,如果 csv 列表不包含服务器的域名怎么办?
  • 这不是问题,是吗?

标签: powershell csv psobject


【解决方案1】:

我认为这可能会对您有所帮助:

$Servers = @(
    [PSCustomObject]@{
        'Server Name' = 'Server1'
        IPAddress = '10.10.10.10'
    }
    [PSCustomObject]@{
        'Server Name' = 'Wrong'
        IPAddress = '10.10.10.999'
    }
    [PSCustomObject]@{
        'Server Name' = 'Server2'
        IPAddress = '10.10.10.15'
    }
)

$Report = foreach ($Server in $Servers) {
    # First we collect all details we know in an object
    $Result = [PSCustomObject]@{
        Name   = $Server.'Server Name'
        IP     = $Server.IPAddress
        Online = $false
    }

    # Then we do the test
    if (Test-Connection -ComputerName $Server.IPAddress -Count 1 -Quiet) {
        # If the connection is successful, we set it to True
        $Result.Online = $true    
    }

    # As a last step we return the complete object
    # where it is collected in the array of Report
    $Result
}

$Report | Select-Object Name, IP, Online

【讨论】:

    【解决方案2】:

    如果您的 CSV 文件有包含主机名的列,您需要将 PSCustomObject 更改为:

    $TestResult = New-Object psobject -Property @{
        IPAddress = $Server.IPAddress
        HostName = $Server.HostName #assuming column name is "HostName"
        Result    = "Result"
    }
    

    如果您的 CSV 文件没有包含主机名的列,您需要使用其 GetHostByAddress 方法请求 System.Net.Dns 类。像这样:

    $TestResult = New-Object psobject -Property @{
        IPAddress = $Server.IPAddress
        HostName = $([System.Net.Dns]::GetHostByAddress($Server.HostName).HostName -join ';')
        Result    = "Result"
    }
    

    在这两种情况下,您都需要通过管道传输 HostName 属性来导出 csv 文件

    $Report | Select-Object IPAddress, HostName, Result | Export-Csv C:\skrypt\bobi\Report.csv -nti
    

    【讨论】:

    • 哇!现在它几乎完美了。 powershell 中是否有任何选项可以更改导出的 csv 结果的颜色?例如:绿色表示在线,红色表示离线。
    • @MaciejObidziński,CSV 文件只是一组原始值。没有颜色或格式。如果您想执行一些额外的表示,您需要将 CSV 更改为 Excel 文件,然后为单元格/行着色。
    • 好的,我找到了 ImportExcel 模块,现在脚本已经完成。谢谢!
    • @MaciejObidziński,我很高兴能为您提供帮助。将我的答案标记为答案,这样它也可能对某人有所帮助。
    猜你喜欢
    • 2020-12-03
    • 2018-06-18
    • 2015-12-14
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2021-08-07
    相关资源
    最近更新 更多