- 我需要在一个CSV中包含"已安装"one_answers"未安装"数据
- 我想我需要加入一个-OR逻辑运算符来包含TRUE/FALSE在一个CSV中输出。我还不知道该怎么做
- 有一个文件夹包含许多*ServerData文件,这些文件包含具有可能重复的KB
- 每个服务器都有一个*ServerData文件,可能有重复的文件
- 我想测试它们中是否有KB2151757和KB4556403
- 然后将结果输出到状态为Installed或Not的csv已安装
- 目前,它只返回已安装KB的计算机的列表
- 如果找不到$patch,则它当前不返回任何内容(null(
- 对于搜索到的每台$计算机,它都需要返回[PCustomObject]
我在想,也许我只需要使用一个函数来查找"已安装"和一个函数查找"未安装",并将结果添加到一起即可导出。我知道怎么做。我觉得一定有更简单的方法。
单击查看CSV 的示例
$computers = Get-Item -path F:*ServerData | Select-Object -ExpandProperty basename
$patch = gc -path F:*ServerData | Sort-Object -Unique | Select-String KB2151757, KB4556403 #'KB(d+)'
$output = ForEach ($computer in $computers) {
ForEach ($kb in $patch) {
if ($null -eq $patch){
[PSCustomObject]@{
Status = 'Not Installed'
Server = $computer
KB = $kb
}
} else{
[PSCustomObject]@{
Status = 'Installed'
Server = $computer
KB = $kb
}
}
}
}
$output | Export-csv C:KB-Report.txt -notypeinformation -delimiter ',' -encoding utf8
如果您首先按照相关的计算机名称对文件进行分组,那么过程就变得简单了(伪代码(:
每台计算机的- 每个ExpectedPatch的
- 如果计算机的ServerData包含ExpectedPatch
- 计算机上ExpectedPatch状态为"Installed"的输出对象
- 其他
- 计算机上ExpectedPatch状态为"NotInstalled"的输出对象
- 如果计算机的ServerData包含ExpectedPatch
所以让我们试一试:
# Define the articles we're looking for
$ExpectedPatches = 'KB2151757', 'KB4556403'
# Enumerate and group data files by computer name, output as hashtable
# The resulting hashtable will have the computer name is Name and the associated files as its value
$ServerDataPerComputer = Get-Item -Path F:*ServerData |Group BaseName -AsHashtable
foreach($Computer in $ServerDataPerComputer.GetEnumerator())
{
foreach($Patch in $ExpectedPatches)
{
# Pipe all the file references to Select-String, look for the KB ID, return after the first match if any
$Status = if($Computer.Value |Select-String "b$Patchb" |Select-Object -First 1){
'Installed'
}
else {
# Select-String didn't find the KB ID in any of the files
'NotInstalled'
}
[pscustomobject]@{
Status = $Status
Server = $Computer.Name
KB = $Patch
}
}
}