这个 foreach 循环中的 @{ } 来自哪里?

这个 foreach 循环中的 @{ } 来自哪里?

我正在编写一个脚本,用于从 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"

相关内容