Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Powershell获取修补程序查找文本文件中提供的更新_Windows_Powershell_Wmic_Hotfix - Fatal编程技术网

Windows Powershell获取修补程序查找文本文件中提供的更新

Windows Powershell获取修补程序查找文本文件中提供的更新,windows,powershell,wmic,hotfix,Windows,Powershell,Wmic,Hotfix,我正在为Win 7 x64 ultimate进行更新。我有一个文本文件,我在其中键入了KBnnnnn,每行一个条目。我想要一种脚本/循环来遍历文本文件中的每个条目,并在已安装的更新中找到它。如果找到,请附加一个带有hotfix ID、说明、日期等和状态为“已安装”的新文本文件。如果未找到,状态为“未安装” 稍后,我想有选择地卸载特定的修补程序,通过类似的循环过程从文本文件中读取每个条目并卸载它,更新屏幕上和另一个文本日志文件中的状态。我对PowerShell非常陌生,尝试使用WMIC在cmd批处

我正在为Win 7 x64 ultimate进行更新。我有一个文本文件,我在其中键入了KBnnnnn,每行一个条目。我想要一种脚本/循环来遍历文本文件中的每个条目,并在已安装的更新中找到它。如果找到,请附加一个带有hotfix ID、说明、日期等和状态为“已安装”的新文本文件。如果未找到,状态为“未安装”


稍后,我想有选择地卸载特定的修补程序,通过类似的循环过程从文本文件中读取每个条目并卸载它,更新屏幕上和另一个文本日志文件中的状态。我对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   <= 
#>