gpt4 book ai didi

powershell - 使用Export-Csv而不是Write-Output/Out-File

转载 作者:行者123 更新时间:2023-12-02 23:23:04 26 4
gpt4 key购买 nike

我有以下“ping脚本”,我想在其中使用数组和Export-Csv cmdlet将输出写入CSV文件而不是txt文件。

我首先尝试将Write-Output用管道传输到Export-Csv,直到读取到无法将字符串用管道传输到Export-Csv且必须首先将它们转换为对象为止。

我不太了解如何在PowerShell中使用数组。

Param(
[Parameter(Mandatory=$true, position=0)][string]$csvfile
)

$ColumnHeader = "Hostname"

Write-Host "Reading file" $csvfile
$ipaddresses = Import-Csv $csvfile | Select-Object $ColumnHeader

Write-Host "Started Pinging.."
foreach ($ip in $ipaddresses) {
if (Test-Connection $ip.("Hostname") -Count 1 -Quiet) {
Write-Output $ip.("Hostname") "Ping succeeded." |
Out-File -FilePath "C:\temp\pingresults.txt" -Append
} else {
Write-Output $ip.("Hostname") "Ping failed." |
Out-File -FilePath "C:\temp\pingresults.txt" -Append
}
}

Write-Host "Pinging Completed."

最佳答案

当然,您可以将字符串传递到Export-Csv中。只是结果可能不会达到您的期望,因为Export-Csv会将输入对象的属性导出为输出文件的字段。 ;)字符串对象只有一个属性(Length),因此最终得到一个输出文件,其中列出了输入字符串的长度。

要获得列出主机名(或IP地址)以及ping结果的输出CSV,您需要构造具有2个属性的对象。在PowerShell中执行此操作的最佳方法是管道:

Import-Csv $csvfile | ForEach-Object {
New-Object -Type PSObject -Property ([ordered]@{
Hostname = $_.Hostname
Online = [bool](Test-Connection $_.Hostname -Count 1 -Quiet)
}
} | Export-Csv 'C:\path\to\output.csv' -NoType

因为您基本上只想向输入数据添加属性,所以可以采用一种更简单的方法,并使用 calculated property添加ping结果:
Import-Csv $csvfile |
Select-Object Hostname,
@{n='Online';e={[bool](Test-Connection $_.Hostname -Count 1 -Quiet)}} |
Export-Csv 'C:\temp\pingresults.csv' -NoType

不建议在循环中附加到数组,因为附加实际上会创建一个具有增大大小的新数组,复制旧数组中的所有元素,然后将新元素添加到新(空)插槽中并释放旧数组。

关于powershell - 使用Export-Csv而不是Write-Output/Out-File,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44271522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com