-
-
Save alkampfergit/2f662c07df0ca379c8e8e65e588c687b to your computer and use it in GitHub Desktop.
class Software { | |
[string]$Name | |
[string]$Id | |
[string]$Version | |
[string]$AvailableVersion | |
} | |
$upgradeResult = winget upgrade | Out-String | |
$lines = $upgradeResult.Split([Environment]::NewLine) | |
# Find the line that starts with Name, it contains the header | |
$fl = 0 | |
while (-not $lines[$fl].StartsWith("Name")) | |
{ | |
$fl++ | |
} | |
# Line $i has the header, we can find char where we find ID and Version | |
$idStart = $lines[$fl].IndexOf("Id") | |
$versionStart = $lines[$fl].IndexOf("Version") | |
$availableStart = $lines[$fl].IndexOf("Available") | |
$sourceStart = $lines[$fl].IndexOf("Source") | |
# Now cycle in real package and split accordingly | |
$upgradeList = @() | |
For ($i = $fl + 1; $i -le $lines.Length; $i++) | |
{ | |
$line = $lines[$i] | |
if ($line.Length -gt ($availableStart + 1) -and -not $line.StartsWith('-')) | |
{ | |
$name = $line.Substring(0, $idStart).TrimEnd() | |
$id = $line.Substring($idStart, $versionStart - $idStart).TrimEnd() | |
$version = $line.Substring($versionStart, $availableStart - $versionStart).TrimEnd() | |
$available = $line.Substring($availableStart, $sourceStart - $availableStart).TrimEnd() | |
$software = [Software]::new() | |
$software.Name = $name; | |
$software.Id = $id; | |
$software.Version = $version | |
$software.AvailableVersion = $available; | |
$upgradeList += $software | |
} | |
} | |
$upgradeList | Format-Table | |
$toSkip = @( | |
'ArtifexSoftware.GhostScript', | |
'Microsoft.VC++2013Redist-x64', | |
'MongoDB.Server', | |
"Microsoft.VC++2015-2019Redist-x64", | |
"Microsoft.VC++2015-2019Redist-x86", | |
"Microsoft.VC++2013Redist-x86", | |
"Microsoft.OneDrive") | |
foreach ($package in $upgradeList) | |
{ | |
if (-not ($toSkip -contains $package.Id)) | |
{ | |
Write-Host "Going to upgrade package $($package.id)" | |
& winget upgrade $package.id | |
} | |
else | |
{ | |
Write-Host "Skipped upgrade to package $($package.id)" | |
} | |
} |
Feel free to post modification here I'll update the script.
Hi
I did add language support and logging.
Now it works on both English and German.
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Company
Winget with exclusions
Name
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
###==================================================================================================================================
Variables
class Software {
[string]$Name
[string]$Id
[string]$Version
[string]$AvailableVersion
}
==============================================
Apps to exclude
$AppstoSkip = @("Microsoft.Office")
$AppstoSkip = @("Microsoft.Office","Google.Chrome")
###==================================================================================================================================
Log File
----------------------------------------------------------------------------
$LogFile = "Winget.txt"
$Dir = "C:_Logs\Winget"
IF(!(Test-Path $Dir)){mkdir $Dir}
$PathLogFile = $Dir + "" + $LogFile
$PathLogFile
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Functions
###==============================================
LogEvent
###==============================================
Function LogEvent([string]$strLOGStatus, [string]$strLogMessage)
{
$GD = get-Date
"$GD-$strLOGStatus-$strLogMessage" | out-file $PathLogFile -append
switch($strLOGStatus)
{
"LOGInfo" {Write-Host $strLogMessage -ForegroundColor "green"}
"LOGError" {Write-Host $strLogMessage -ForegroundColor "red"}
"LOGWarning" {Write-Host $strLogMessage -ForegroundColor "Yellow"}
}
}
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
DATA Gathering Section
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
LogEvent "LOGInfo" ("--------------------------------------------------")
LogEvent "LOGInfo" ("--------- Starting Winget Upgrade Script - gathering DATA")
==============================================
Getting the winget list
$upgradeResult = winget upgrade | Out-String
$lines = $upgradeResult.Split([Environment]::NewLine)
==============================================
Find the line that starts with Name, it contains the header
$fl = 0
while (-not $lines[$fl].StartsWith("Name"))
{
$fl++
}
==============================================
Get languge
$Lang = Get-WinSystemLocale | select -ExpandProperty name
IF( $lang -eq "en-US"){
English
Write-Host ("Language is English - " + $lang)
# $Lines has the header, where we can find the character Id, Available, Version and Source
$idStart = $lines[$fl].IndexOf("Id")
$versionStart = $lines[$fl].IndexOf("Version")
$availableStart = $lines[$fl].IndexOf("Available")
$sourceStart = $lines[$fl].IndexOf("Source")
}
IF( $lang -eq "de-DE"){
German
Write-Host ("Sprache ist Deutsch - " + $lang)
# $Lines has the header, where we can find the GERMAN character ID, Version, Verfügbar and Quelle
$idStart = $lines[$fl].IndexOf("ID")
$versionStart = $lines[$fl].IndexOf("Version")
$availableStart = $lines[$fl].IndexOf("Verfügbar")
$sourceStart = $lines[$fl].IndexOf("Quelle")
}
==============================================
Now cycle in real package and split accordingly
$upgradeList = @()
For ($i = $fl + 1; $i -le $lines.Length; $i++)
{
$line = $lines[$i]
if ($line.Length -gt ($availableStart + 1) -and -not $line.StartsWith('-'))
{
$name = $line.Substring(0, $idStart).TrimEnd()
$id = $line.Substring($idStart, $versionStart - $idStart).TrimEnd()
$version = $line.Substring($versionStart, $availableStart - $versionStart).TrimEnd()
$available = $line.Substring($availableStart, $sourceStart - $availableStart).TrimEnd()
$software = [Software]::new()
$software.Name = $name;
$software.Id = $id;
$software.Version = $version
$software.AvailableVersion = $available;
$upgradeList += $software
}
}
==============================================
Winget Upgrade List
LogEvent "LOGInfo" ("Winget Upgrade List: ")
$upgradeList | Format-Table
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
RUN Section
###[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
###==============================================
Upgrading Software
###==============================================
Foreach ($package in $upgradeList)
{
IF (-not ($AppstoSkip -contains $package.Id))
{
LogEvent "LOGInfo" ("--------------------------------------------------")
LogEvent "LOGInfo" ("--------- Going to upgrade package $($package.id)")
& winget upgrade $package.id
}
else
{
LogEvent "LOGInfo" ("Skipped upgrade to package $($package.id)")
}
}
i've edited the script. It should work no matter the language and also is bit shorter
https://gist.github.com/nouseforname/a8b7ebcb9d0c05e380c7e3c81c300923
I have just discovered that there is a gist for this.. Oh well.. anyhow, i've modified it a bit, fixing that truncation issue & added grid view for package selection https://gist.github.com/inxomnyaa/0ee29d68a6b4c92ba53810828dbc0f4a
Thanks so much @geraldodinukwe80, I'll come up with a more universal solution, I think we can just check that the current line has ID and current version, and that those values aren't empty.