Powershell 将foreach循环的结果导出到CSV

Powershell 将foreach循环的结果导出到CSV,powershell,Powershell,该脚本读取计算机名的.TXT文件。然后检查Windows Update是否设置为自动或手动;然后将计算机名称和更新类型导出为CSV。起初,它只是导出最终的计算机及其类型。我做了一些研究,发现创建一个对象来保存名称和类型,然后将该对象添加到数组中是可行的。但是,将阵列导出到CSV会产生与阵列相关的有趣数据,而不是计算机名称和类型。最重要的是,我在控制台预导出中打印了数组,它看起来是最后一台计算机,它的类型列出了9倍,是我正在读取的一个.TXT文件中的计算机数量。我知道export CSV现在有一个

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

好的,有几件事。从各方面考虑,脚本看起来相当不错,再加上一些小的调整,应该可以正常工作。让我们稍微改变一下方法,一次构造一个对象,而不是让它添加noteproperties

另外,我们只需调用一个GWMI(Get-WMIObject的缩写)。我想这对你来说会更好。首先,进行一次GWMI调用意味着我们在进行调用时必须选择多个对象。既然你真的打了两次完全相同的电话,每次都从中选择了两个不同的东西,这就有点道理了。我们将跳过在select中定义内容,只让
$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 
好的,现在我们创建对象,然后直接将其添加到数组中。在这里,我们将名称和StartupType等定义为对象属性,因此当您稍后显示数组时,它会显示每个项目的这两个属性。之后,我们将关闭ForEach循环,并将列表显示到屏幕上,然后通过管道将其导出到CSV以保存结果

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

因此,这不会检查以确保系统联机,也不会执行任何类似的错误检查,但如果您同意,那么我认为这应该完全满足您的需要。

这非常有效!我真的很感谢你的帮助,一天来我一直在想这个问题,只是想不出问题所在。谢谢