我正在为Win 7 x64 Ultimate进行更新。我有一个文本文件,在其中每行键入KBnnnnn一次。我想要某种脚本/循环遍历文本文件中的每个条目,然后在已安装的更新中找到它。如果找到,请添加一个新的文本文件,其中包含HotFixID,描述,日期等,并且状态为'INSTALLED'。如果未找到,则状态为“未安装”
稍后,我想通过类似的循环过程从文本文件中读取每个条目并进行卸载,然后更新屏幕上和其他文本日志文件中的状态,来选择性地卸载特定的HotFix。我对PowerShell非常陌生,尝试使用WMIC在cmd批处理脚本中创建循环,但尚未成功。
请指导
您在这里有多个问题,而这不是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
我想要某种脚本/循环
当然可以。向我们显示您的代码。否则,您就是在请当地人为您做事,那不是真的。好吧,有时候有人会觉得有趣或挑战,但不是一件简单的事情。
以上每个帮助文件都有循环示例。
浏览文本文件中的每个条目并在已安装的文件中找到它更新。
好,这是常见的事情。 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从文本文件读取每个条目并将其卸载的过程,
再次,这里没有什么新奇或复杂的现象,这是非常普遍的事情。您可以通过代码中的比较块/命令来执行此操作。
更新屏幕上和其他文本日志文件中的状态。
再次,这里没有什么新奇或复杂的现象,这是非常普遍的事情。这是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'
示例脚本] >>
'powershellgallery.com hotfix management'
'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 <=
#>