导入CSV文件,运行端口连接,然后导出到新的CSV文件。

3
我有一个Sources.csv文件,其中包含“源”,“主机”和“端口”列(源只是我要连接的设备的名称)。我的目标是逐行遍历这个CSV文件,对IP和端口运行连接测试,然后导出到一个新的csv文件中,该文件包括相同的列以及一个新的“Reachable”列。这是我目前所拥有的,但我的CSV文件充满了各种看起来毫无意义的信息...因此我想知道是否有人能指导我朝正确的方向发展:
$path = '.\Sources.csv'
$csv = Import-Csv -Path $path
Foreach($line in $csv){
    $TCPTest = Test-NetConnection $line.host -Port $line.port
    $Test = @{DataSource=$line.source; IP=$line.host; Port=$line.port; 
        Reachable=$TCPTest.TcpTestSucceeded}
    $Test | Export-Csv -Path .\SourceChecks.csv -append
    }

你能解决你的问题吗? - jimhark
2个回答

1
你可以使用 计算属性Select-Object 来处理这个问题:
$path = '.\Sources.csv'
Import-Csv -Path $path | Select-Object *, @{
    Name       = 'Reachable'
    Expression = {Test-NetConnection $_.Host -Port $_.Port -InformationLevel Quiet}
} | Export-Csv newpathtocsv.csv -NoTypeInformation

使用-InformationLevel QuietTest-NetConnection上,以便该命令返回一个布尔值:

如果将此参数设置为Quiet,则该命令将返回基本信息。例如,对于ping测试,该命令返回一个布尔值,指示是否成功尝试ping主机或端口。

如果您不希望看到警告消息显示在控制台中,还可以添加-WarningAction Ignore
值得注意的是,如果您有许多目标主机和端口需要测试连接,则Test-NetConnection速度相当慢。如果您想加快此过程,可以尝试使用this function。它利用了 .NET TcpClient的异步能力。
以下是一个以CSV格式为输入的示例:
Host,Port
google.com,80
google.com,8080
cisco.com,80
cisco.com,443
amazon.com,80
amazon.com,389
amazon.com,636

输出将变为:
PS /> Import-Csv $path | Test-TCPConnectionAsync -TimeOut 10

Source             Destionation Port Success
------             ------------ ---- -------
sourceComputerName google.com     80    True
sourceComputerName cisco.com     443    True
sourceComputerName cisco.com      80    True
sourceComputerName amazon.com     80    True
sourceComputerName google.com   8080   False
sourceComputerName amazon.com    389   False
sourceComputerName amazon.com    636   False

1
信息级别参数用得不错。我承认我以前不知道这个,一直从完整结果中选择TcpTestSucceeded。 - jimhark
@jimhark 感谢您的编辑。显然我很少使用 Select-Object 计算属性。 - Santiago Squarzon
没问题。以前我的代码必须在PowerShell版本2上运行时,我经常使用计算属性。(呃!)现在我使用PSCustomObject更加开心了。 - jimhark

1

Santango的答案适用于所有PowerShell版本,包括第1版(我想是这样的)。

如果您可以接受依赖PowerShell Version 3(发布于2012年),还有另一个选项:

$sourcesPath = '.\Sources.csv'

$sources = Import-Csv $sourcesPath

$sources | ForEach {
    $reachable = Test-NetConnection $_.host -Port $_.port -InformationLevel Quiet

    [PSCustomObject]@{
        Source = $_.Source
        Host = $_.Host
        Port = $_.Port
        Reachable = $reachable
    }
} | 
Export-Csv newpathtocsv.csv

谢谢!这个完美地解决了问题!很抱歉回复晚了。 - Christopher Cass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接