关于powershell:将foreach循环的结果导出为CSV

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调用意味着我们必须选择多个选项。由于您实际上两次进行了完全相同的呼叫,并且每次都从中选择两个不同的内容,因此这很有意义。我们将跳过在选择中定义的内容,仅让$pcName存储GWMI调用中的所有数据。但是,首先,我们要确保$pcName中没有旧数据,只是为了确保不会重复。

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

因此,这不会检查以确保系统处于联机状态,也不会进行任何错误检查,但是如果您满意,那么我认为这应该完全满足您的需求。