excel 网络连接测试PowerShell

wribegjk  于 2023-05-19  发布在  Shell
关注(0)|答案(2)|浏览(190)

我在将这个基本的网络连接测试导出到Export-Excel(import-Excel)功能时遇到了问题。我需要从创建的阵列中导出网络连接测试的结果。
每个CSV服务器列表有2列服务器名称和端口
代码如下:

Import-Csv -Path .\serverlist.csv -Delimiter "," | ForEach-Object {$_.servers       
    
    $status = Test-NetConnection -ComputerName $_.servers -Port $_.port 
    

    if ($status.TcpTestSucceeded -eq $True) {
        $result = "ONLINE"
        $onlineCount ++    }

    elseif ($status.TcpTestSucceeded -eq $false) {
        $result = "OFFLINE"
        $offlineCount ++    }
    else {
        $result = "ERROR"
    }

   $result = [PSCustomObject]@{
                    ComputerName = $status.ComputerName
                    Port         = $status.RemotePort
                    Status       = $result
                    Date         = Get-Date -Format "dd/MM/yyyy"
                    Time         = Get-Date -Format "HH:mm"
                }    

    } $result | Export-Excel -Path ".\netStatus.xlsx" -AutoSize -AutoFilter -WorksheetName Net_Test 

    ii ".\netStatus.xlsx"

这是Excel的结果。请参阅只有一列包含地址。我需要:计算机名、端口、状态、日期、时间

我希望$result数组在excel中显示如下:

我也得到这个错误:

ioekq8ef

ioekq8ef1#

像这样的东西应该工作。我转换为csv,因为我不确定Export-Excel是什么。你的代码的主要问题是,你只会得到最后一个结果,因为你放的最后一个$result,你得到的remainingScripts错误是因为你需要为ForEach-Object指定-开始-Process和-End脚本块。如果你想用烟斗|'导入Export-Excel,您需要删除Export-Excel前的$result。您需要使用Write-Output*将您的数据输出到Pipe。

$csv = Import-Csv -Path .\serverlist.csv -Delimiter "," | ForEach-Object -Begin {} -Process {
    # Do this so it doesn't get confused for output by PowerShell. 
    # I am assuming this is for visual only.
    Write-Host ($_.servers)       
    
    $status = Test-NetConnection -ComputerName $_.servers -Port $_.port 
    

    if ($status.TcpTestSucceeded -eq $True) {
        $result = "ONLINE"
        $onlineCount ++    }

    elseif ($status.TcpTestSucceeded -eq $false) {
        $result = "OFFLINE"
        $offlineCount ++    }
    else {
        $result = "ERROR"
    }

   Write-Output ([PSCustomObject]@{
                    ComputerName = $status.ComputerName
                    Port         = $status.RemotePort
                    Status       = $result
                    Date         = Get-Date -Format "dd/MM/yyyy"
                    Time         = Get-Date -Format "HH:mm"
                })   

    } -End {} | ConvertTo-Csv -NoTypeInformation
    # This is just to write the result to the host. It can be removed.
    $csv
qojgxg4l

qojgxg4l2#

我认为你的问题与最终$结果的列出有关。重新创建你的脚本,甚至没有输出到Excel(所以只是屏幕),如果我有它作为

} $result

我也犯了同样的错误。但如果我把它改成

}
$result

那它就能正常运转除了它不做你想要的事情,因为它只会在你从ForEach循环外部调用它时输出最后一个结果。所以它实际上需要

$result
}

所以ForEach-Object循环的每次迭代都会输出/导出该命令的结果。
下面的代码有我上面提到的建议修改,可以工作,并做您想要的。

Import-Csv -Path c:\batchscripts\serverlist.csv -Delimiter "," | ForEach-Object { $_.Servers    
    $status = Test-NetConnection -ComputerName $_.servers -Port $_.port 

    if ($status.TcpTestSucceeded -eq $True) {
        $result = "ONLINE"
        $onlineCount ++    }

    elseif ($status.TcpTestSucceeded -eq $false) {
        $result = "OFFLINE"
        $offlineCount ++    }
    else {
        $result = "ERROR"
    }
   
    $result = [PSCustomObject]@{
        ComputerName = $status.ComputerName
        Port         = $status.RemotePort
        Status       = $result
        Date         = Get-Date -Format "dd/MM/yyyy"
        Time         = Get-Date -Format "HH:mm"
    } 
    $result | export-csv -Path c:\batchscripts\pingoutput.csv -Append         
}

唯一的区别是我输出到.csv而不是.xlsx,因为我没有Excel在这台机器上测试该部分。
但是使用serverlist.csv包含

Servers,Port
www.microsoft.com,80
www.amazon.com,80

我得到的输出为

#TYPE System.Management.Automation.PSCustomObject
"ComputerName","Port","Status","Date","Time"
"www.microsoft.com","80","ONLINE","17/05/2023","06:00"
"www.amazon.com","80","ONLINE","17/05/2023","06:00"

相关问题