【问题标题】:Exporting results of foreach loop to CSV将 foreach 循环的结果导出到 CSV
【发布时间】:2014-05-12 12:56:48
【问题描述】:

脚本读取计算机名称的 .TXT 文件。然后它会检查 Windows 更新是否设置为自动或手动;然后将计算机名称和更新类型导出为 CSV。起初,它只是导出最终的计算机及其类型。我做了一些研究,发现创建一个对象来保存名称和类型,然后将该对象添加到数组中是可行的。但是,将数组导出到 CSV 会产生与数组相关的有趣数据,而不是与计算机名称和类型相关的数据。最重要的是,我在控制台预导出中打印出了数组,它看起来是最后一台计算机,它的类型列出了 9 次,这是我正在读取的一个 .TXT 文件中的计算机数量。我知道export-CSV 现在有一个附加参数可以解决这个问题,但我们办公室里有更多的 PS 1.0 和 2.0,需要它来处理这些版本。

clear-host

$item = new-object PSObject
$list = @()
$c=Get-Credential
$a = gc "c:\Scripts\pcList.txt"

ForEach ($b in $a) 
{
    $pcName = Get-WmiObject win32_service -filter 'name="wuauserv"' -computer $b -credential $c -ErrorAction SilentlyContinue |
select-object name,
@{N="System Name";E={$_.Systemname}}
    $name = $pcName.'System Name'
    $item | Add-Member NoteProperty Name $name -Force

    $pcType = Get-WmiObject win32_service -filter 'name="wuauserv"' -computer $b -            credential $c -ErrorAction SilentlyContinue |
select-object name, @{N="Startup Type";E={$_.StartMode}}
    $type = $pcType.'Startup Type'
    $item | Add-Member NoteProperty StartupType $type -Force    

    $list += $item
}
Write-Host $list

export-csv -Path "c:\Scripts\pcListCSV" -inputobject $list -notype

【问题讨论】:

    标签: powershell


    【解决方案1】:

    好的,有几件事。考虑到所有因素,脚本看起来确实相当不错,并进行了一些小调整,它应该可以正常工作。让我们处理这个有点不同,只是一次构建对象,而不是先创建它然后添加注释属性。

    此外,我们只需调用 1 次 GWMI(Get-WMIObject 的缩写)。我认为这对你来说会更好。首先,调用一次 GWMI 意味着我们在调用时必须选择不止一个东西。由于您确实两次拨打完全相同的电话,并且每次都从中选择两个不同的东西,所以这很有意义。我们将跳过在选择中定义事物,让$pcName 存储来自 GWMI 调用的所有数据。不过,首先我们要确保$pcName 中没有旧数据,以确保我们没有重复。

    clear-host
    
    $item = new-object PSObject
    $list = @()
    $c=Get-Credential
    $a = gc "c:\Scripts\pcList.txt"
    
    ForEach ($b in $a) 
    {
        if(Get-Variable pcName -ea SilentlyContinue){Remove-Variable pcName}
        $pcName = Get-WmiObject win32_service -filter 'name="wuauserv"' -computer $b -credential $c -ErrorAction SilentlyContinue 
    

    好的,现在我们创建对象,我们将直接将它添加到数组中。在这里,我们将诸如 Name 和 StartupType 之类的东西定义为对象属性,因此当您稍后显示数组时,它会显示每个项目的这两个属性。之后,我们将关闭 ForEach 循环并将列表显示到屏幕并将其通过管道传输到 Export-CSV 以保存结果。

        $list += New-Object PSObject -Property @{
            Name = $pcName.SystemName
            StartupType = $pcName.StartMode
        }
    }
    $list
    $list | Export-Csv "C:\Scripts\pcList.CSV" -notype
    

    所以,这不会检查以确保系统在线,也不会进行任何类似的错误检查,但如果你没问题,那么我认为这应该完全符合你的需要。

    【讨论】:

    • 效果很好!我非常感谢您的帮助,我已经为此苦苦挣扎了一天,只是无法弄清楚问题所在。谢谢!
    猜你喜欢
    • 2014-12-05
    • 2016-03-13
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多