首页 > 解决方案 > 将 CSV 导入数组,然后通过 ForEach 循环运行每个 IP

问题描述

我正在尝试编写一个 PowerShell 脚本来从 CSV 文件 ping 每个 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

标签: powershellloopsscriptingnetwork-programming

解决方案


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

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

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

添加-Header开关允许您在不修改文件的情况下处理您的列。基本上,假设它在您导入文件之前暂时将标题添加到第一列。

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

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

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

要包括失败,我会尝试实现如下所示:https ://stackoverflow.com/a/51690032/4868262基本上,根据命令的成功设置状态字段,从而允许您在输出中查看失败。

希望这有帮助!


推荐阅读