Windows Powershell获取修补程序查找文本文件中提供的更新
我正在为Win 7 x64 ultimate进行更新。我有一个文本文件,我在其中键入了KBnnnnn,每行一个条目。我想要一种脚本/循环来遍历文本文件中的每个条目,并在已安装的更新中找到它。如果找到,请附加一个带有hotfix ID、说明、日期等和状态为“已安装”的新文本文件。如果未找到,状态为“未安装”Windows Powershell获取修补程序查找文本文件中提供的更新,windows,powershell,wmic,hotfix,Windows,Powershell,Wmic,Hotfix,我正在为Win 7 x64 ultimate进行更新。我有一个文本文件,我在其中键入了KBnnnnn,每行一个条目。我想要一种脚本/循环来遍历文本文件中的每个条目,并在已安装的更新中找到它。如果找到,请附加一个带有hotfix ID、说明、日期等和状态为“已安装”的新文本文件。如果未找到,状态为“未安装” 稍后,我想有选择地卸载特定的修补程序,通过类似的循环过程从文本文件中读取每个条目并卸载它,更新屏幕上和另一个文本日志文件中的状态。我对PowerShell非常陌生,尝试使用WMIC在cmd批处
稍后,我想有选择地卸载特定的修补程序,通过类似的循环过程从文本文件中读取每个条目并卸载它,更新屏幕上和另一个文本日志文件中的状态。我对PowerShell非常陌生,尝试使用WMIC在cmd批处理脚本中创建循环,但尚未成功。为什么不使用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,每行一个条目
好的,这是一个标准文件,可以使用导入Csv或获取内容轻松读取。然而,你为什么要这样做?有一个名为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
我想要一种脚本/循环
当然,你能做到
上述每个帮助文件都有循环示例
检查文本文件中的每个条目并在“已安装”中找到它
更新
好吧,这是一件平常的事。PowerShell是一个非常初级的东西,在web上有很多关于它的文章、示例和视频,并显示在help cmdlet、参考资料等中
如果找到,请附加一个带有hotfix ID、说明、日期等的新文本文件。,
并且状态为“已安装”。如果未找到,状态为“未安装”
同样,这里没有什么新的或复杂的东西,这是一件非常常见的事情,可以通过-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 loop有选择地卸载特定的修补程序
从文本文件中读取每个条目并将其卸载
再说一次,这里没有什么新的或复杂的东西,一次又一次,这是一件非常普通的事情。您可以通过代码中的比较块/命令来实现这一点
更新屏幕和其他文本日志文件中的状态
再说一次,这里没有什么新的或复杂的东西,一次又一次,这是一件非常普通的事情。这就是输出文件、导出Csv、开始转录或编写自己的记录器以及使用进度条的目的。大量的文章、博客、视频以及如何做到这一点
我对PowerShell非常陌生,尝试在cmd batch中创建循环
使用WMIC编写脚本,但尚未成功
好的,这很好。这意味着你应该先花时间学习它,有很多基于文本和视频的免费视频(YouTube视频、MSDN视频等)供你使用。它所需要的只是你搜索它,按原样使用它们,或者根据需要调整它们
示例脚本
这里的问题是,为什么要直接使用WMIC和Powershell?因此,上面使用了cmdlet。人们可以使用WMIC,而不必像多年来那样在.bat/cmd/vbs文件中使用PowerShell
您说您已经完成了批处理文件编程,很高兴看到您使用PowerShell池,但这并不意味着您不能坚持使用批处理来完成需要的工作,然后现在或以后将其转换为PowerShell
根据您的代码注释进行更新
如果在console/ISE/VSCode中执行此操作,它的工作方式与cmd.exe相同
wmic qfe get hotfixid > d:\temp\QfElist.txt
Get-content -Path 'd:\temp\QfElist.txt'
<#
Results
KB4537572
KB4513661
...
#>
现在使用以下命令读取文件
Get-Content -Path 'D:\Temp\KBCheckList.txt'
<#
# Results
KdId
KB4537572
KB4513661
KB4515400
#>
获取内容-路径'D:\Temp\KBCheckList.txt'
还是这个
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
#>
Import Csv-路径'D:\Temp\KBCheckList.txt'
您可以看到差异很小(视觉上),但Csv文件需要一个标题(实际上应该首先正确格式化)。要么将其添加到文件顶部,要么动态添加
Import-Csv -Path 'D:\Temp\KBCheckList.txt' -Header 'KBID'
<#
# Results
KBID
----
KB4537572
KB4513661
KB4515400
#>
Import Csv-路径'D:\Temp\KBCheckList.txt'-标题'KBID'
以上这些对你来说都是教育性的东西。您只需要以下两种中的一种,或类似的
现在只需使用该文件。读入循环并使用if/then或try/catch语句获得结果
Import-Csv -Path 'D:\Temp\KBCheckList.txt' -Header 'KBID' |
ForEach {
$PSItem.KBID
}
<#
# Results
KB4537572
KB4513661
KB4515400
#>
Import Csv-路径'D:\Temp\KBCheckList.txt'-标题'KBID'|
弗雷奇{
$PSItem.KBID
}
或者将文件列表与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 <=
#>
$QfeData=获取修补程序
$KBCheckList=导入Csv-路径“D:\Temp\KBCheckList.txt”-标题“KBID”
比较对象-引用对象$QfeData.HotFixID-差异对象$KBCheckList.KBID
***这意味着此ID仅位于作为文件的DifferenceObject中,因此未安装。
KB4515383您刚刚在伪代码中列出了要执行的每个步骤。那么,就这么定了。人们会告诉你StackOverflow不是一个免费的脚本编写服务,如果你来这里,你的帖子会被否决或关闭。你不能被派到这里:。您需要展示您的工作、您寻找/尝试的内容,并发布您的代码、输入、预期输出和错误。你所展示的东西并不难,网上有很多关于如何做到这一点的文章、视频和示例。包括在PowerShell帮助文件中。是的,谢谢你指出。我急于把这个问题发出去。我在CMD批处理脚本中尝试了很多次,但在我来这里住了很多次之后,这些脚本都不起作用。当我试图提供一个带有KBnnn的文本文件作为查找参考,以确认查找文件中的文本文件是否安装在我的系统中时,出现了问题。此外,这不是一个优雅的方式来做我所需要的工作。对不起,不能适应我在这个评论窗口中尝试的所有内容。我尝试过但没有成功:“wmic qfe get hotfixid>c:\list.txt”,“对于(c:\list.txt)中的/f%I,执行echo wusa/uninstall/kb:%I/quiet/norestart>c:\uninstall.cmd”,然后运行“uninstall.cmd”注释有其局限性。用代码更新你原来的帖子。这使得人们很难跟踪和帮助你。再说一次,当然
Import-Csv -Path 'D:\Temp\KBCheckList.txt' -Header 'KBID'
<#
# Results
KBID
----
KB4537572
KB4513661
KB4515400
#>
Import-Csv -Path 'D:\Temp\KBCheckList.txt' -Header 'KBID' |
ForEach {
$PSItem.KBID
}
<#
# Results
KB4537572
KB4513661
KB4515400
#>
$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 <=
#>