将 CSV 导入数组,然后 运行 通过 ForEach 循环来 ping 每个 IP

Import-CSV to array, then run through a ForEach loop to ping each IP

我正在尝试编写一个 PowerShell 脚本来对 CSV 文件中的每个 IP 地址执行 4 次 ping 操作。 我知道这个脚本有很多问题,我边工作边学习。 让我难过的一个问题是,当我 运行 脚本时,$iplist 变量采用第一个变量,然后 运行s 通过列表。 我认为这与数组和 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

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

$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 地址被设置为列 header,这就是您看到 @{ip=ip}.

的原因

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

如果您确定只有一栏,您也可以将文件视为纯文本。例如,您可以这样做:

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

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

为了包括失败,我会尝试实现这样的东西:https://whosebug.com/a/51690032/4868262基本上,根据命令的成功设置状态字段,从而允许您在输出中查看失败。

希望对您有所帮助!