将CSV导入到阵列,然后通过ForEach循环运行以ping通每个IP

时间:2018-08-13 14:49:13

标签: powershell loops scripting network-programming

我正在尝试编写PowerShell脚本以ping通CSV文件中的每个IP地址4次。 我知道此脚本有很多问题,我正在学习和学习。 我遇到的一个问题是,当我运行脚本时,$ iplist变量将使用第一个变量,然后在列表中运行。 我认为这与数组和import-Csv有关,但是我无法弄清楚它或将其破坏得足够好以获取线索。

谢谢

出于安全考虑,我省略了完整的目标位置

$iplist = @(Import-Csv "Book1.csv")

Write-Host $iplist

ForEach ($Data in $iplist)
{
Test-Connection $Data | Out-File  Bookx.txt
}

当$ iplist的内容为Write-Host时,将显示以下内容: @ {151.171.77.24 = 151.171.175.132} @ {151.171.77.24 = 151.171.175.131}

有几十个都具有相同的151.171.77.24 = 请注意,151.171.77.24是Book1.csv中的第一个IP

1 个答案:

答案 0 :(得分:0)

鉴于@{}应该是@{key=value},我假设您在CSV文件中没有标题。试试这个:

$iplist = import-csv Book1.csv -Header 'test'
ForEach ($Data in $iplist)
{
   Test-Connection $Data.test | Out-File  Bookx.txt -Append
}

基本上,CSV文件是网格,有点像2D数组。每列都需要一些键来定义它。您可以这样处理这些字段:$Data.column1$Data.column2。即使您只有一列,您仍然必须遵守这些规则。在这种情况下,您的第一个IP地址被设置为列标题,这就是为什么看到@{ip=ip}的原因。

添加-Header开关使您无需修改​​文件即可寻址列。基本上,假设在导入文件之前,它会在第一列中临时添加标题。

如果确定只有一列,则也可以将文件视为纯文本。例如,您可以执行以下操作:

Get-Content file.csv | % {Test-Connection $_}

Get-Content将创建一个数组,每个项目都是一行。然后,您可以执行以下操作:对于每行,用当前行的IP test-connection

要包含故障,我将尝试实现如下所示的方法:https://stackoverflow.com/a/51690032/4868262基本上,根据命令的成功设置状态字段,从而使您可以查看输出中的故障。

希望这对您有帮助!