我正在编写一个脚本,用于从 CSV 中获取 IP 地址,然后尝试 ping/连接它们。最终,我将对它们运行一些命令,并将其全部作为额外数据输出到 CSV 中。现在,我正在使用 2 个不同的 CSV(输入和输出),直到我弄清楚附加过程。
#Create a CSV
$CSVOutput = "$PSScriptRoot\Addresses scanned $(Get-Date -format “MM-dd-yyyy HHmm ss”).csv"
Write-Host "Creating output file " $CSVOutput
New-Item $CSVOutput -type file
$NewLine = "{0},{1}" -f "IPAddress", "Status"
$NewLine | add-content -path $CSVOutput
$inputCSV = "$PSScriptRoot\Addresses.csv"
$ipaddresses = import-csv $inputCSV | select-object "IPAddress" #$ColumnHeader
$inputCSV = "$PSScriptRoot\Addresses.csv"
$ipaddresses = import-csv $inputCSV
foreach($ip in $ipaddresses) {
Write-Host $ip
if (test-connection $ip.("IPAddress") -count 1 -quiet) {
$NewLine = "{0},{1}" -f $ip, "online"
$NewLine | add-content -path $CSVOutput
} else {
write-host $ip.("IPAddress") "Ping failed." -foreground red
$NewLine = "{0},{1}" -f $ip, "offline"
$NewLine | add-content -path $CSVOutput
}
}
由于某些奇怪的原因,脚本以 的形式输出 IP 地址@{IPAddress=172.18.16.1}
,或者如果我注释掉导入行的管道输出,我会得到以下信息:@{IPAddress=172.18.16.2; Status=}
。在尝试调试此问题时,我将其添加Write-Host $ip
到循环中的第一行foreach
。
我只能猜测我遇到了某种对象与字符串问题,或者我以某种方式引入了额外的格式,但我无法克服它。我只想使用实际的 IP 地址,我不想要前导和尾随格式@{}
我做错了什么?如何删除多余的格式?
答案1
您只需要$ip
在$NewLine
定义中更改为$ip.IPAddress
。$ip
是 PSCustomObject 类型,其中$ip.IPAddress
是 String 类型。
您还没有定义$CSVOutput
,应该删除的第二个定义$ipaddresses
。
$inputCSV = ".\ipadr.csv"
$CSVOutput = ".\out.csv"
$ipaddresses = import-csv $inputCSV | select-object
foreach($ip in $ipaddresses) {
Write-Host $ip.IPAddress
if (test-connection $ip.IPAddress -count 1 -quiet) {
$NewLine = "{0},{1}" -f $ip.IPAddress, "online"
$NewLine | add-content -path $CSVOutput
} else {
write-host $ip.IPAddress "Ping failed." -foreground red
$NewLine = "{0},{1}" -f $ip.IPAddress, "offline"
$NewLine | add-content -path $CSVOutput
}
}
答案2
这是我以有限的方式使其工作的方法,主要的改变是 ForEach 循环,我改用这个: $ipaddresses.IPAddress | ForEach-Object
。
另一个变化是在 Write-Host 行中输出 Success/Failure: Write-Host $_ "Ping failed." -foreground red
。
此外,$NewLine 变量: $NewLine = "{0},{1}" -f $_, "online"
。
最后,这就是我所做的事情。我无法像您那样对其进行全面测试,但在我的虚拟 Addresses.csv 中使用 2 个 IP,其中一个 IP 合法,另一个不合法,它按您期望的方式工作:
$inputCSV = "$PSScriptRoot\Addresses.csv"
$ipaddresses = Import-CSV $inputCSV
$ipaddresses.IPAddress | ForEach-Object {
if (test-connection $_ -count 1 -quiet) {
Write-Host $_ "Ping success." -foreground green
$NewLine = "{0},{1}" -f $_, "online"
$NewLine | add-content -path $CSVOutput
} else {
Write-Host $_ "Ping failed." -foreground red
$NewLine = "{0},{1}" -f $_, "offline"
$NewLine | add-content -path $CSVOutput
}
}
答案3
创建新 CSV 文件的 PowerShell 方式如下:
$OutputCSV = "$PSScriptRoot\AddressesChecked.csv"
$InputCSV = "$PSScriptRoot\Addresses.csv"
$IpAddresses = Import-Csv $InputCSV
$IPStatus = ForEach($IP in $IpAddresses.IPAddress) {
If (Test-Connection $IP -Count 1 -Quiet) {
[PSCustomObject]@{IPAddress = $IP
Status = "online"}
} else {
[PSCustomObject]@{IPAddress = $IP
Status = "offline"}
}
}
$IPStatus | Export-Csv $OutputCSV -NoTypeInformation
$IPStatus
屏幕输出示例:
> .\SU_1235174.ps1
IPAddress OnlineStatus
--------- ------------
192.168.1.1 online
192.168.1.60 offline
192.168.1.91 offline
192.168.1.92 offline
转换为 Csv 文件:
> gc .\AddressesChecked.csv
"IPAddress","OnlineStatus"
"192.168.1.1","online"
"192.168.1.60 ","offline"
"192.168.1.91 ","offline"
"192.168.1.92 ","offline"