【问题标题】:Export list/array to CSV in Powershell在 Powershell 中将列表/数组导出为 CSV
【发布时间】:2018-09-15 14:55:15
【问题描述】:

做了一些谷歌搜索,但我发现的答案似乎比我需要的更复杂。我有一个简单的脚本来获取 DNS 缓存条目,我想以最“powershell”的方式将结果导出到 CSV。代码如下所示:

function Get-Dns
{
    $domains = @()
    $cmdOutput = Invoke-Command -ScriptBlock {ipconfig /displaydns}
    ForEach ($line in $($cmdOutput -split "`r`n"))
    {
        if ($line -like '*Record Name*'){
            $domain = $line -split ":"
            $domains += $domain[1]
    }
}

所以我有一个数组 $domains,我想使用 Export-CSV 基本上输出一列 CSV,每行一个域。使用 Export-CSV 似乎只是输出每个元素的长度而不是内容本身。任何帮助表示赞赏!

【问题讨论】:

    标签: powershell csv export


    【解决方案1】:

    PowerShell方式:

    (ipconfig /displaydns|where{$_-match'Record Name'})|%{$_.split(":")[1].Trim()}>dnscache.txt
    

    【讨论】:

    • 感谢您的意见!
    • 除了使用 Export-Csv 函数外,有什么方法可以达到同样的效果吗?我试图与脚本的其他方面保持一致。
    • 没有看到脚本的其他部分,我无法告诉你如何做到这一点。为了使数据正确输出到 csv,您需要创建一个对象,我将制定一个示例并发布另一个答案。
    • 实际上,看起来@LordAdam 有一个很好的解决方案,可以满足您的需求,这正是我的想法。
    【解决方案2】:

    "ipconfig /displaydns" 将返回一个 big'ol 字符串数组,这将更难处理。尝试使用本机命令行开关进行 DNS 操作:

    Get-DnsClientCache | Export-Csv -Path .\stuff.csv
    

    如果您使用的是 Windows 7 或更早版本,请试试这个...

    $dns_client_cache = @()
    $raw_dns_data = ipconfig /displaydns
    for ($element = 3; $element -le $raw_dns_data.length - 3; $element++) {
        if ( $raw_dns_data[$element].IndexOf('Record Name') -gt 0 ) {
            if ( $dns_entry ) { $dns_client_cache += $dns_entry }
            $dns_entry = New-Object -TypeName PSObject
            Add-Member -InputObject $dns_entry -MemberType NoteProperty -Name 'RecordName' -Value $raw_dns_data[$element].Split(':')[1].Trim()
        } elseif ( $raw_dns_data[$element].IndexOf('Record Type') -gt 0 ) {
            Add-Member -InputObject $dns_entry -MemberType NoteProperty -Name 'RecordType' -Value $raw_dns_data[$element].Split(':')[1].Trim()
        } elseif ( $raw_dns_data[$element].IndexOf('Time To Live') -gt 0 ) {
            Add-Member -InputObject $dns_entry -MemberType NoteProperty -Name 'TimeToLive' -Value $raw_dns_data[$element].Split(':')[1].Trim()
        } elseif ( $raw_dns_data[$element].IndexOf('Data Length') -gt 0 ) {
            Add-Member -InputObject $dns_entry -MemberType NoteProperty -Name 'DataLength' -Value $raw_dns_data[$element].Split(':')[1].Trim()
        } elseif ( $raw_dns_data[$element].IndexOf('Section') -gt 0 ) {
            Add-Member -InputObject $dns_entry -MemberType NoteProperty -Name 'Section' -Value $raw_dns_data[$element].Split(':')[1].Trim()
        } elseif ( $raw_dns_data[$element].IndexOf('CNAME Record') -gt 0 ) {
            Add-Member -InputObject $dns_entry -MemberType NoteProperty -Name 'CNAMERecord' -Value $raw_dns_data[$element].Split(':')[1].Trim()
        }
    }
    
    $dns_client_cache | Export-Csv -Path .\dns_stuff.csv -Force -NoTypeInformation
    

    对不起!我知道这很乱。

    【讨论】:

    • 哇。很有用。谢谢!
    • 快速提问 - 这似乎在我正在测试的某些主机上支​​持,但在其他主机上不支持?有没有办法确保它可以在任何安装了 powershell 的系统上运行?谢谢!
    • 添加-CimSession参数:-CimSession
    • 啊,Win7好像不支持Get-DnsClientCache。瘸!我想我将不得不走 cmd displaydns 路线。
    • 哎呀。是的,Windows 7 没有该命令行开关所需的操作系统位。我相信你是对的。
    【解决方案3】:

    我最终将多个值数组导出到 csv

    $Data | %{$_} | export-csv -nti -Path C:\
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多