该脚本读入计算机名称的.TXT文件。然后检查Windows Update是否设置为Auto或Manual;然后将计算机名称和更新类型导出为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
答案 0 :(得分:2)
好的,有几件事。该剧本看起来相当不错,考虑了所有事情,并且有一些小调整,它应该可以正常工作。让我们接近一点不同,只需一次构造对象,而不是再添加noteproperties。
此外,我们只需要调用1次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
好的,现在我们创建了对象,我们只是将它直接添加到数组中。这里我们将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
所以,这不会检查以确保系统处于联机状态,或者进行任何类似的错误检查,但如果你没关系,那么我认为这应该完全符合你的需要。