PowerShell 调用命令速度 (win32_product)
PowerShell Invoke-Command Speed (win32_product)
我写了一个简短的脚本来卸载多台计算机上的程序(来自主机名的文本文档)。该脚本按预期工作,但每个主机大约需要 2-3 分钟。有没有办法同时在所有机器上执行此操作?
这是我的脚本。
$computers = Get-Content C:\Computernames.txt
foreach($Computer in $computers){
Invoke-Command -ComputerName $Computer -ScriptBlock{
$application = Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%Appname%'"
#uninstall the app if it exists
if($application){
$application.Uninstall()
Write-Output "Application uninstalled successfully.."
}
else{
Write-Output "Application not found.."
}
}
}
我可以做 Invoke-Command -ComputerName $Computers
并同时做所有机器以避免循环吗?
按照建议,使用 $Computers
成功。我能够摆脱我的循环并极大地加快脚本速度。
这是更新后的脚本 - 感谢您告诉我它支持数组。
#list of computers
$computers = Get-Content C:\Computernames.txt
Invoke-Command -ComputerName $computers -ScriptBlock{
$application = Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%appname%'"
if($application){
$application.Uninstall()
Write-Output "Successful uninstall on $env:COMPUTERNAME "
}
else{
Write-Output "Application not found on $env:COMPUTERNAME"
}
}
win32_product class 是出了名的慢,因为它会在使用时验证每个 msi。我假设 appname 被替换为特定名称。您可以在 powershell 5.1 中使用鲜为人知的 get-package 和 uninstall-package,但仅限于 msi 提供程序:
get-package appname | uninstall-package
我写了一个简短的脚本来卸载多台计算机上的程序(来自主机名的文本文档)。该脚本按预期工作,但每个主机大约需要 2-3 分钟。有没有办法同时在所有机器上执行此操作?
这是我的脚本。
$computers = Get-Content C:\Computernames.txt
foreach($Computer in $computers){
Invoke-Command -ComputerName $Computer -ScriptBlock{
$application = Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%Appname%'"
#uninstall the app if it exists
if($application){
$application.Uninstall()
Write-Output "Application uninstalled successfully.."
}
else{
Write-Output "Application not found.."
}
}
}
我可以做 Invoke-Command -ComputerName $Computers
并同时做所有机器以避免循环吗?
按照建议,使用 $Computers
成功。我能够摆脱我的循环并极大地加快脚本速度。
这是更新后的脚本 - 感谢您告诉我它支持数组。
#list of computers
$computers = Get-Content C:\Computernames.txt
Invoke-Command -ComputerName $computers -ScriptBlock{
$application = Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%appname%'"
if($application){
$application.Uninstall()
Write-Output "Successful uninstall on $env:COMPUTERNAME "
}
else{
Write-Output "Application not found on $env:COMPUTERNAME"
}
}
win32_product class 是出了名的慢,因为它会在使用时验证每个 msi。我假设 appname 被替换为特定名称。您可以在 powershell 5.1 中使用鲜为人知的 get-package 和 uninstall-package,但仅限于 msi 提供程序:
get-package appname | uninstall-package