Powershell Get-HotFix查找文本文件中提供的更新

问题描述 投票:-2回答:1

我正在为Win 7 x64 Ultimate进行更新。我有一个文本文件,在其中每行键入KBnnnnn一次。我想要某种脚本/循环遍历文本文件中的每个条目,然后在已安装的更新中找到它。如果找到,请添加一个新的文本文件,其中包含HotFixID,描述,日期等,并且状态为'INSTALLED'。如果未找到,则状态为“未安装”

稍后,我想通过类似的循环过程从文本文件中读取每个条目并进行卸载,然后更新屏幕上和其他文本日志文件中的状态,来选择性地卸载特定的HotFix。我对PowerShell非常陌生,尝试使用WMIC在cmd批处理脚本中创建循环,但尚未成功。

请指导

windows powershell wmic hotfix
1个回答
1
投票

您在这里有多个问题,而这不是StackOverflow的工作方式。

您为什么不为此使用WSUS?这就是为什么它存在。 MS powershellgallery.com中有一些用于此类用例的模块。

Find-Module -Name '*WSUS*' | Format-Table -AutoSize

Version Name              Repository Description                                                                                                                               
------- ----              ---------- -----------                                                                                                                               
2.3.1.6 PoshWSUS          PSGallery  PowerShell module to manage a WSUS Server. Support site: https://github.com/proxb/PoshWSUS/                                               
1.1.0   ecs.wsus          PSGallery  This Windows PowerShell module contains ECS.WSUS funtions                                                                                 
0.4.4   PSWsusSpringClean PSGallery  Give your WSUS server a thorough spring cleaning                                                                                          
0.9.0   PSWSUSMigration   PSGallery  Powershell module to help WSUS (Windows Server Update Services) server migration. Support site: https://github.com/reiikei/PSWSUSMigration

我正在为Win 7 x64 Ultimate进行更新。

所以,您在Win7上使用的是哪个版本的PowerShell?

我有一个文本文件,在其中每行输入KBnnnnn一次。

确定,可以使用Import-Csv或Get-Content轻松读取的标准文件。但是,为什么要这样做?为此有一个名为Get-HotFix的cmdlet。

# All Help topics and locations
Get-Help about_*
Get-Help about_Functions

Get-Help about* | Select Name, Synopsis

Get-Help about* | 
Select-Object -Property Name, Synopsis |
Out-GridView -Title 'Select Topic' -OutputMode Multiple |
ForEach-Object { Get-Help -Name $_.Name -ShowWindow }

explorer "$pshome\$($Host.CurrentCulture.Name)"

# Get parameters, examples, full and Online help for a cmdlet or function

# Get a list of all functions
Get-Command -CommandType Function | 
Out-GridView -PassThru -Title 'Available functions'

# Get a list of all commandlets
Get-Command -CommandType Cmdlet | 
Out-GridView -PassThru -Title 'Available cmdlets'

# get function / cmdlet details
Get-Command -Name Import-Csv -Syntax
(Get-Command -Name Import-Csv).Parameters.Keys
Get-help -Name Import-Csv -Full
Get-help -Name Import-Csv -Online
Get-help -Name Import-Csv -Examples

Get-Command -Name Get-Content -Syntax
(Get-Command -Name Get-Content).Parameters.Keys
Get-help -Name Get-Content -Full
Get-help -Name Get-Content -Online
Get-help -Name Get-Content -Examples


Get-Command -Name Get-Hotfix -Syntax
(Get-Command -Name Get-Hotfix).Parameters.Keys
Get-help -Name Get-Hotfix -Full
Get-help -Name Get-Hotfix -Online
Get-help -Name Get-Hotfix -Examples

我想要某种脚本/循环

当然可以。向我们显示您的代码。否则,您就是在请当地人为您做事,那不是真的。好吧,有时候有人会觉得有趣或挑战,但不是一件简单的事情。

About ForEach

以上每个帮助文件都有循环示例。

浏览文本文件中的每个条目并在已安装的文件中找到它更新。

好,这是常见的事情。 PowerShell是一个非常初学者的东西,在Web上为此有很多文章,示例和视频,并显示在帮助cmdlet,资源等中。

[如果找到,请添加带有HotFixID,描述,日期等的新文本文件,并且status =“已安装”。如果未找到,则状态为“未安装”

再次,这里没有什么新奇或复杂的现象,这是非常普遍的事情。通过-Append开关或Add-Content cmdlet完成。

Get-Command -Name Add-Content -Syntax
(Get-Command -Name Add-Content).Parameters.Keys
Get-help -Name Add-Content -Full
Get-help -Name Add-Content -Online
Get-help -Name Add-Content -Examples

之后我想通过simial循环有选择地卸载特定的HotFix从文本文件读取每个条目并将其卸载的过程,

再次,这里没有什么新奇或复杂的现象,这是非常普遍的事情。您可以通过代码中的比较块/命令来执行此操作。

About Comparison Operators

更新屏幕上和其他文本日志文件中的状态。

再次,这里没有什么新奇或复杂的现象,这是非常普遍的事情。这是Out-File或Export-Csv,Start-Transcript或编写自己的记录器的目的,并使用进度条。许多文章,博客和视频介绍如何执行此操作。

Script Write-Log PowerShell Logging Function

Get-Command -Name Write-Progress -Syntax
(Get-Command -Name Write-Progress).Parameters.Keys
Get-help -Name Write-Progress -Full
Get-help -Name Write-Progress -Online
Get-help -Name Write-Progress -Examples

我对PowerShell非常陌生,试图在cmd批处理中创建一个循环使用WMIC编写脚本,但尚未成功。

[好的,这很好,但是那仍然不意味着,当您说尝试使用X或Y时,请人们为您完成工作。对于您的WMIC。这也确实意味着您应该先花时间学习它,并且有很多免费的基于文本和基于视频的内容(YOuTube视频,MSDN视频等)供您使用。它所需要的只是您搜索它,按原样使用它们,或根据需要进行调整。

'powershell windows hotfix management'

'Beginning PowerShell'

'Intermediate PowerShell'

'Advanced PowerShell'

'PowerShell file and folder management'

'PowerShell hotfix report'

示例脚本] >>

'powershellgallery.com hotfix management'

'wmic find hotfix'

'vbscript wmic hotfix management'

这里的问题是为什么您直接使用WMIC,而直接使用Powershell?因此,上面的cmdlet。多年来,人们一直可以在.bat / cmd / vbs文件中完全不使用PowerShell来使用WMIC。

您说您已经完成了批处理文件编程,很高兴看到您进入了PowerShell池,但这并不意味着您不能坚持使用批处理来完成所需的工作,然后将其转换为PowerShell。

有一些PowerShell模块可以下载并用于此用例。

根据您的代码注释更新

如果您在控制台/ ISE / VSCode中进行了此操作,则它可以从cmd.exe中正常运行

wmic qfe get hotfixid > d:\temp\QfElist.txt 

Get-content -Path 'd:\temp\QfElist.txt' 
<#
Results

KB4537572  

KB4513661  

...
#>

但是您可以做到这一点,并获得更多有用的东西

Get-HotFix
<#
# Results

Source        Description      HotFixID      InstalledBy          InstalledOn              
------        -----------      --------      -----------          -----------              
LP70          Update           KB4537572     NT AUTHORITY\SYSTEM  11-Mar-20 00:00:00       
LP70          Update           KB4513661                          09-Sep-19 00:00:00       
LP70          Security Update  KB4515383                          09-Sep-19 00:00:00       
...
#>

将其与文件进行比较同样简单。假设您的文件如下所示。

$KBCheckList = '
KB4537572
KB4513661
KB4515400
' | Out-File -FilePath 'D:\Temp\KBCheckList.txt'

现在使用此文件读取文件

Get-Content -Path 'D:\Temp\KBCheckList.txt'
<#
# Results

KdId
KB4537572
KB4513661
KB4515400
#>

或此

Import-Csv -Path 'D:\Temp\KBCheckList.txt'
<#
# Results

WARNING: One or more headers were not specified. Default names starting with "H" have been used in place of any missing headers.

H1       
--       
KB4537572
KB4513661
KB4515400
#>

您可以看到差异很小(在视觉上),但是Csv文件需要一个标头(实际上应该先正确格式化)。可以将其添加到文件的顶部,也可以快速添加]

Import-Csv -Path 'D:\Temp\KBCheckList.txt' -Header 'KBID'
<#
# Results

KBID     
----     
KB4537572
KB4513661
KB4515400
#>

以上所有内容对您来说都是教育性的东西。您只真正需要以下两个之一或类似。

现在只使用文件。循环阅读并使用if / then或try / catch语句获取结果

Import-Csv -Path 'D:\Temp\KBCheckList.txt' -Header 'KBID' | 
ForEach {
    $PSItem.KBID
}
<#
# Results

KB4537572
KB4513661
KB4515400
#>

或仅将文件列表与cmdlet结果进行比较

$QfeData = Get-Hotfix
$KBCheckList = Import-Csv -Path 'D:\Temp\KBCheckList.txt' -Header 'KBID' 
Compare-Object -ReferenceObject $QfeData.HotFixID -DifferenceObject $KBCheckList.KBID
<#
# Results

InputObject SideIndicator
----------- -------------
KB4515400   =>            *** this means that this ID is only in the DifferenceObject which is your file, thus not installed.    
KB4515383   <=           
KB4516115   <=           
KB4517245   <=           
KB4521863   <=           
KB4524244   <=           
KB4524569   <=           
KB4525419   <=           
KB4528759   <=           
KB4537759   <=           
KB4538674   <=           
KB4541338   <=           
KB4551762   <= 
#>
© www.soinside.com 2019 - 2024. All rights reserved.