我有我当前的脚本显示结果,但是当它出现时它只是将所有内容放在一个长列中,但它们是有序的。任何想法我怎么能得到三列称为“计算机名称”“补丁#”“已安装?”。
以下是我的代码
$strCategory = "computer"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$ObjSearcher.SearchRoot = $objDomain
$objSearcher.filter = ("(objectCategory=$strCategory)")
$colProplist = "name"
foreach($i in $colProplist){
$objSearcher.PropertiesToLoad.Add($i)
}
#Finds all operating systems and computer names
$colResults = $objSearcher.FindAll()
foreach($objResult in $colResults){
$objComputer = $objResult.Properties;
$names = $objComputer.name
# Define Hotfix to check
$CheckKBS = @("KB2937610", "KB4019264")
# Query the computers for the HotFix
foreach($name in $names){
foreach ($CheckKB in $CheckKBS) {
$HotFixQuery = Get-HotFix -ComputerName $name | Where-Object {$_.HotFixId -eq $CheckKB} | Select-Object -First 1;
if($HotFixQuery -eq $null) {
Out-file C:\Users\xxx\Desktop\12.csv -Append -InputObject "computername: $name"
Out-file C:\Users\xxx\Desktop\12.csv -Append -InputObject "“KB Patch: $CheckKB"
Out-file C:\Users\xxx\Desktop\12.csv -Append -InputObject "Hotfix $CheckKB is not installed on $name"
} else {
Out-file C:\xxx\xxx\xxx\12.csv -Append -InputObject "computername: $name"
Out-file C:\xxx\xxx\xxx\12.csv -Append -InputObject "KB Patch; $CheckKB"
Out-file C:\xxx\xxx\xxx\12.csv -Append -InputObject "Hotfix $CheckKB was installed on $name by $($HotFixQuery.InstalledBy)"
}
}
}
}
答案 0 :(得分:2)
您正在将原始文本输出到CSV中,但是您必须保持预期的目标格式。
out-file将输出原始文本,每行一个。这就是您的调用创建单个列的原因。您可以更改代码以将输出折叠为由逗号分隔的1行:
index.js
这会将1个原始行写入您的CSV文件。假设CSV文件的其余部分完好无损,您的字段将被视为列。
我怀疑你想在每行重复你的标题,但想要告诉你它的样子。现在,您将要在开始循环之前编写CSV文件的初始行以输出标题:
Out-file C:\Users\xx\Desktop\12.csv -Append -InputObject “computer name: $name,KB Patch: $CheckKB,Hotfix $CheckKB is not installed on $name”
然后从循环中写入的行中删除标题内容。这意味着每次运行都会写入标题,因此您要么在开始时要擦除文件,要么在编写标题之前测试它是否存在。
有更好的方法可以做到这一点,但这并不要求您对工作进行重大更改。我会为每条记录创建一个自定义对象,创建这些对象的集合,然后通过export-csv导出它们。如果这样可以更好地满足您的需求,请仅对其请求发表评论。