Exporting results of foreach loop to CSV
该脚本读取计算机名称的.TXT文件。然后检查Windows Update是否设置为"自动"或"手动"。然后将计算机名称和更新类型导出到CSV。最初,它只是导出最终计算机及其类型。我做了一些研究,发现创建一个对象来保存名称和类型,然后将该对象添加到数组中是可行的。但是,将阵列导出为CSV会产生有趣的数据,该数据与阵列相关,而不是计算机名称和类型。最重要的是,我在控制台预导出中打印出了阵列,它看起来是最后一台计算机,其类型列出了9次,即我正在读取的一个.TXT文件中的计算机数量。我知道export-CSV现在具有一个append参数,可以解决此问题,但是我们办公室中有更多PS 1.0和2.0,需要在这些版本上使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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进行1次调用(Get-WMIObject的缩写)。我认为这对您会更好。首先,进行一次GWMI调用意味着我们必须选择多个选项。由于您实际上两次进行了完全相同的呼叫,并且每次都从中选择两个不同的内容,因此这很有意义。我们将跳过在选择中定义的内容,仅让
1 2 3 4 5 6 7 8 9 10 11 | 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以保存结果。
1 2 3 4 5 6 7 | $list += New-Object PSObject -Property @{ Name = $pcName.SystemName StartupType = $pcName.StartMode } } $list $list | Export-Csv"C:\\Scripts\\pcList.CSV" -notype |
因此,这不会检查以确保系统处于联机状态,也不会进行任何错误检查,但是如果您满意,那么我认为这应该完全满足您的需求。