news 2026/5/4 20:56:38

Windows软件包管理器(WinGet)最实用教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows软件包管理器(WinGet)最实用教程

1. 什么是 WinGet

微软公司在 2020 年 5 月 Microsoft Build 开发者大会上发布了用于 Windows 系统的官方支持的软件包管理器 —— Windows 软件包管理器(Windows Package Manager),也就是 WinGet 软件包管理器。经过 3 年的发展,越来越多的软件厂商在这个平台上发布自家软件。WinGet 除了支持 exe、msi 等传统的 Win32 安装包格式外,还支持用于新版 Windows 的 msix/msixbundle 格式所打包的软件。

​编辑Windows 软件包管理器(WinGet)learn.microsoft.com/en-us/windows/package-manager


2. 获取 WinGet

首先确认系统是否满足需求:WinGet 只可以运行在 Windows10 高于 1709 (Build 16299) 的版本和 Windows11 上。

在安装 WinGet 之前,建议使用微软新推出的终端模拟器 Windows Terminal 代替传统的conhost.exe。

2.1 Windows10/11 非 LTS 版本(家庭版、教育版、专业版、专业工作站版、企业版)

Windows Terminal 和 WinGet 都可以通过系统预装的 Microsoft Store 商店搜索安装,也可以转到下面的网页调用 Microsoft Store 安装,也可以去微软托管在 GitHub 的发布页下载安装包到本地安装(较新版本的 Windows11 已经预装,如已预装请略过此章节)。

Windows Terminal

​编辑Windows Terminal - Microsoft Storeapps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=en-us&gl=us

Windows Terminal - GitHubgithub.com/microsoft/terminal/releases

WinGet

​编辑WinGet - Microsoft Storeapps.microsoft.com/store/detail/app-installer/9NBLGGH4NNS1?hl=en-us&gl=us

WinGet - GitHubgithub.com/microsoft/winget-cli/releases

2.2 Windows10/11 LTS 版本,长期服务频道(企业版 LTSC,IoT 企业版 LTSC)

如果使用了 Windows LTSC 版本的系统,需要先安装一个 Microsoft Store 的环境才能安装 Windows Terminal 和 WinGet。

CTRL+SHIFT+ESC 呼出任务管理器,打开详细信息界面:

任务管理器

从菜单栏运行新任务:

文件 --> 运行新任务

勾选管理员权限,输入 conhost 或 cmd,打开命令行窗口:

以管理员权限创建新任务

命令行窗口

输入命令:

wsreset.exe -i

使用命令安装 Microsoft Store

等待运行完成,待到窗口重新出现命令提示符以后,开始菜单出现了 Microsoft Store 的图标,就可以参考 Windows10/11 非 LTS 版本的安装方法安装 Windows Terminal 和 WinGet 。

2.3 设置 Windows Terminal 为系统默认终端模拟器

较新版本的 Windows11 已经默认 Windows Terminal 为系统终端模拟器,如已配置好请略过此章节。

从命令行窗口标题栏右键菜单进入默认设置:

打开命令提示符的默认设置

在【终端】选项卡下更改“默认终端应用程序”为“Windows 终端”,确认退出:

终端 --> 更改默认终端应用程序


3. 使用 WinGet 管理软件

3.1 概述

使用 WinGet,大多数软件就可以像 Linux 发行版的软件安装方式一样可以通过 apt/apt-get、yum、pacman 等命令在终端模拟器中以一条命令即可做到。很多大佬已经写过 WinGet 的使用教程,再加之微软官方给出的参考文档和实例也已经十分详实,这里就不再赘述,只列举几个最常用的命令,以开源压缩软件 7-Zip 举例。

​编辑WinGet 使用帮助learn.microsoft.com/en-us/windows/package-manager/winget

3.2 常用命令:替换源

微软官方软件包服务器的访问速度不稳定,可能出现一直超时失败的情况,这里可以替换为国内的镜像源,类似于 Debian 系 Linux 发行版的 add-apt-repository 命令。在使用 WinGet 之前,可以替换软件软件源为中科大的镜像源:

winget source remove winget winget source add winget https://mirrors.ustc.edu.cn/winget-source

替换软件源

3.3 常用命令:搜索软件包

winget search 7zip

WinGet 搜索软件

3.4 常用命令:查看软件包

winget show --id 7zip.7zip

WinGet 查看软件信息

3.5 常用命令:安装软件包

winget install --id 7zip.7zip --rainbow

WinGet 安装软件时“--rainbow”参数可以开启彩虹特效进度条

3.6 常用命令:更新软件包

winget upgrade --id 7zip.7zip --rainbow

WinGet 更新软件时“--rainbow”参数可以开启彩虹特效进度条

3.7 常用命令:卸载软件包

winget uninstall --id 7zip.7zip

WinGet 卸载软件


4. 使用 WinGet + GUI 管理软件

4.1 什么是 WingetUI

众所周知,Windows 被设计为一个图形界面的操作系统,整个系统的交互逻辑都是围绕着所见即所得的图形化方式设计的;而 WinGet 却是一个传统的命令行程序,对于日常管理来说,还是不够直观;并且整天面对黑乎乎的命令行窗口也难免审美疲劳。所以,开源软件 WingetUI 应运而生,完美解决了 WinGet 在面向普通用户的使用过程中的诸多痛点。

WingetUI 是 Martí Climent 开发的一个基于 WinGet 软件包管理器的图形界面前端,它让普通用户管理来自 WinGet 的软件包变得十分容易。WingetUI 除了支持 WinGet,还支持其他一些常见的包管理器,如 Scoop、Chocolatey、PIP、Npm 和 .NET Tool 的管理。常见操作包括对软件包的搜索、查看、安装、升级、卸载和分享等;支持批量安装、导出或导入软件包列表等功能;支持导出操作命令;支持自动从源更新软件包信息并静默更新。

作者网站:

Martí Climentmarticliment.com/

项目地址:

WingetUI - GitHubgithub.com/marticliment/WingetUI

软件详情:

关于 WingetUI

4.2 获取和使用 WingetUI

既然有了 WinGet ,就可以直接从 WinGet 安装 WingetUI:

winget install --id SomePythonThings.WingetUIStore --rainbow

通过 WinGet 安装 WingetUI

如果遇到网络问题等不方便直接从 WinGet 下载安装的情况,还可以使用网络正常的电脑下载 WingetUI 安装包到本地,再拷贝回目标设备安装:

WingetUI 安装程序github.com/marticliment/WingetUI/releases/latest/download/WingetUI.Installer.exe

WingetUI 本地安装程序界面

安装完成后,从桌面或开始菜单启动 WingetUI 即可使用图形界面管理软件。

WingetUI 软件界面

WingetUI 的使用十分简单与直观,这里不做赘述。来自作者帮助文档链接如下:

WingetUI 帮助文档github.com/marticliment/WingetUI/wiki


5 使用 WinGet + PowerShell 管理软件

5.1 使用批处理或 PS 脚本管理 WinGet 软件包

在 Linux 发行版中,包管理器的作用是提供一个统一的应用程序分发平台,以便在维护、备份和迁移的过程中进行自动化部署和配置;对于普通用户,一个常见的做法是将安装部署应用程序的命令行保存为 Shell 脚本,以便快速安装。对于 Windows 平台下的 WinGet 也毫无疑问可以采用这种最常用的方法来管理程序:将 WinGet 命令保存为 *.bat *.cmd *.ps1 等批处理脚本或 PowerShell 脚本进行自动化部署。

5.2 使用 PS 脚本从网络批量下载来自 WinGet 的软件包

众所周知,因为历史遗留的兼容性包袱,Windows 平台的软件包不能说是包罗万象,只能说是千奇百怪。例如在安装软件时,安装程序通常提供可以指定为当前用户安装或为所有用户安装的选项、可以任意指定到自定义的目录、可以指定是否创建桌面和开始菜单快捷方式等等;其中大部分软件的安装配置都可以适应 WinGet 用于指定软件包的安装方式额外控制参数(详见 winget install 命令),但少数软件并不能适应 WinGet 安装命令的控制参数。遇到这种情况,通常的做法是直接访问软件提供商的官方网站去下载安装包,但如今有了 WinGet 包管理器,搭配实用的 PowerShell 工具,便可以编写脚本,从 WinGet 源直接获取软件包信息并下载到本地手动安装。

推荐使用 PowerShell 7.0 以上版本运行脚本,下载地址如下:

PowerShell - Microsoft Storeapps.microsoft.com/store/detail/powershell/9MZ1SNWT0N5D?hl=en-us&gl=us

PowerShell - GitHubgithub.com/PowerShell/PowerShell

部署好 PowerShell 后,用任意文本编辑器(Nodepad、VSC、Geany、VIM 等)编写用于直接从 WinGet 源获取软件安装包信息的脚本(此处已添加一些开发人员常用的应用程序和工具,如 VC++Runtime、JDK、Git 等,可按需求自行搜索与查看 WinGet 源,灵活增减):

# Requires -Version 7.0 #更改字符集为UTF-8 #[System.Console]::OutputEncoding=[System.Text.Encoding]::GetEncoding(65001) # 更新源 # winget source reset winget # winget source add winget https://mirrors.ustc.edu.cn/winget-source/ Clear-Host # 写入安装脚本 $Script:PackageCount = 0 $Script:PackageLocalPath = "PackageInstallers" $Script:PackageList = "PackageInstallers.log" $Script:PackageScriptIWR = "Get-PackageInstallersIWR.ps1" $Script:PackageScriptSBT = "Get-PackageInstallersSBT.ps1" $Script:PackageScriptWCD = "Get-PackageInstallersWCD.ps1" $Script:PackageLogIWR = [System.String]::Concat($Script:PackageLocalPath, "\PackageInstallersIWR.log") $Script:PackageLogSBT = [System.String]::Concat($Script:PackageLocalPath, "\PackageInstallersSBT.log") $Script:PackageLogWCD = [System.String]::Concat($Script:PackageLocalPath, "\PackageInstallersWCD.log") New-Item -Name $Script:PackageLocalPath -ItemType Directory -Force | Out-Null Remove-Item $Script:PackageLocalPath\* -Recurse -Force | Out-Null Write-Output $null | Out-File $Script:PackageList Write-Output $null | Out-File $Script:PackageScriptIWR Write-Output $null | Out-File $Script:PackageScriptSBT Write-Output $null | Out-File $Script:PackageScriptWCD [System.String]::Concat("# Updated @ ", (Get-Date -Format "yyyy.MM.dd-HH:mm:ss")) | Tee-Object $Script:PackageScriptIWR -Append | Tee-Object $Script:PackageScriptSBT -Append | Out-File $Script:PackageScriptWCD -Append Write-Output "# Requires -Version 7.0" | Tee-Object $Script:PackageScriptIWR -Append | Tee-Object $Script:PackageScriptSBT -Append | Out-File $Script:PackageScriptWCD -Append Write-Output "`$Script:PackageLocalCount = 0" | Tee-Object $Script:PackageScriptIWR -Append | Tee-Object $Script:PackageScriptSBT -Append | Out-File $Script:PackageScriptWCD -Append Write-Output "Clear-Host" | Tee-Object $Script:PackageScriptIWR -Append | Tee-Object $Script:PackageScriptSBT -Append | Out-File $Script:PackageScriptWCD -Append Write-Output "New-Item -Name `"$Script:PackageLocalPath`" -ItemType Directory -Force | Out-Null" | Tee-Object $Script:PackageScriptIWR -Append | Tee-Object $Script:PackageScriptSBT -Append | Out-File $Script:PackageScriptWCD -Append Write-Output "Remove-Item `"$Script:PackageLocalPath\*`" -Recurse -Force | Out-Null" | Tee-Object $Script:PackageScriptIWR -Append | Tee-Object $Script:PackageScriptSBT -Append | Out-File $Script:PackageScriptWCD -Append Write-Output "Write-Output `$null | Out-File `"$Script:PackageLogIWR`"" | Out-File $Script:PackageScriptIWR -Append Write-Output "Write-Output `$null | Out-File `"$Script:PackageLogSBT`"" | Out-File $Script:PackageScriptSBT -Append Write-Output "Write-Output `$null | Out-File `"$Script:PackageLogWCD`"" | Out-File $Script:PackageScriptWCD -Append # 安装脚本函数 function Get-WinGetPackageURL { param($ID, $Name, $Type, $Class) $Private:PackageWinGetID = $ID $Private:PackageFilename = $Name $Private:PackageFiletype = $Type $Private:PackageClassification = $Class $Private:PackageLocalClassifiedPath = [System.String]::Concat($Script:PackageLocalPath, "\", $Private:PackageClassification) $Private:FindURL = "安装程序 URL:" $Private:FindVER = "版本:" # 获取软件包版本和下载地址 try { # System Installer $Private:PackageURL = [System.String]::Concat((winget show --scope machine -id $Private:PackageWinGetID | Select-String $Private:FindURL)).Replace($Private:FindURL, "").Replace(" ", "") $Private:PackageVersion = [System.String]::Concat((winget show --scope machine -id $Private:PackageWinGetID | Select-String $Private:FindVER)).Replace($Private:FindVER, "").Replace(" ", "") } catch [ArgumentNullException] { # User Installer $Private:PackageURL = [System.String]::Concat((winget show --id $Private:PackageWinGetID | Select-String $Private:FindURL)).Replace($Private:FindURL, "").Replace(" ", "") $Private:PackageVersion = [System.String]::Concat((winget show --id $Private:PackageWinGetID | Select-String $Private:FindVER)).Replace($Private:FindVER, "").Replace(" ", "") } $Script:PackageCount++ $Private:PackageLocalFile = [System.String]::Concat($Private:PackageLocalClassifiedPath, "\", $Private:PackageFilename, "_", $Private:PackageVersion, ".", $Private:PackageFiletype) $Private:PackageUpdateTime = Get-Date -Format "yyyy.MM.dd-HH:mm:ss" $Private:PackageCommandPath = "New-Item -Name `"$Private:PackageLocalClassifiedPath`" -ItemType Directory -Force | Out-Null" $Private:PackageCommandItem = "New-Item -Name `"$Private:PackageLocalFile`" -ItemType File -Force | Out-Null" $Private:PackageCommandDNS = "ipconfig.exe /flushdns | Out-Null" $Private:PackageCommandIWR = "Invoke-WebRequest -Uri `"$Private:PackageURL`" -OutFile `"$Private:PackageLocalFile`"" $Private:PackageCommandSBT = "Start-BitsTransfer -Source `"$Private:PackageURL`" -Destination `"$Private:PackageLocalFile`"" $Private:PackageCommandWCD = "`$PackageWebClient = New-Object System.Net.WebClient; `$PackageWebClient.DownloadFile(`"$Private:PackageURL`", `"$Private:PackageLocalFile`")" $Private:PackageCommandLog = "Start-Sleep -Seconds 3; [System.Console]::Out.Flush(); [System.String]::Concat(`"┏━ `", (Get-Date -Format `"yyyy.MM.dd-HH:mm:ss`"), `" @ $Private:PackageWinGetID`", `" [$Private:PackageVersion]``n`", `"┣━ ```"$Private:PackageURL```"``n`", `"┗━ ```"$Private:PackageLocalFile```"``n`") | Write-Output" Write-Output "┏━ $Private:PackageUpdateTime @ $Private:PackageWinGetID [$Private:PackageVersion]`n┣━ `"$Private:PackageURL`"`n┗━ `"$Private:PackageLocalFile`"`n" | Tee-Object $Script:PackageList -Append Write-Output "$Private:PackageCommandPath; $Private:PackageCommandItem; $Private:PackageCommandDNS; $Private:PackageCommandIWR; if (`$?) { `$Script:PackageLocalCount++; $Private:PackageCommandLog | Tee-Object `"$Script:PackageLogIWR`" -Append; }" | Out-File $Script:PackageScriptIWR -Append Write-Output "$Private:PackageCommandPath; $Private:PackageCommandItem; $Private:PackageCommandDNS; $Private:PackageCommandSBT; if (`$?) { `$Script:PackageLocalCount++; $Private:PackageCommandLog | Tee-Object `"$Script:PackageLogSBT`" -Append; }" | Out-File $Script:PackageScriptSBT -Append Write-Output "$Private:PackageCommandPath; $Private:PackageCommandItem; $Private:PackageCommandDNS; $Private:PackageCommandWCD; if (`$?) { `$Script:PackageLocalCount++; $Private:PackageCommandLog | Tee-Object `"$Script:PackageLogWCD`" -Append; }" | Out-File $Script:PackageScriptWCD -Append New-Item -Name $Private:PackageLocalClassifiedPath -ItemType Directory -Force | Out-Null New-Item -Name $Private:PackageLocalFile -ItemType File -Force | Out-Null } ipconfig /flushdns | Out-Null # Components Get-WinGetPackageURL -ID "Microsoft.VCRedist.2005.x86" -Name "Microsoft_Visual_C++_Redistributable_2005_32bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2005.x64" -Name "Microsoft_Visual_C++_Redistributable_2005_64bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2008.x86" -Name "Microsoft_Visual_C++_Redistributable_2008_32bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2008.x64" -Name "Microsoft_Visual_C++_Redistributable_2008_64bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2010.x86" -Name "Microsoft_Visual_C++_Redistributable_2010_32bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2010.x64" -Name "Microsoft_Visual_C++_Redistributable_2010_64bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2012.x86" -Name "Microsoft_Visual_C++_Redistributable_2012_32bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2012.x64" -Name "Microsoft_Visual_C++_Redistributable_2012_64bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2013.x86" -Name "Microsoft_Visual_C++_Redistributable_2013_32bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2013.x64" -Name "Microsoft_Visual_C++_Redistributable_2013_64bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2015+.x86" -Name "Microsoft_Visual_C++_Redistributable_2015_32bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.VCRedist.2015+.x64" -Name "Microsoft_Visual_C++_Redistributable_2015_64bit" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Microsoft.PowerToys" -Name "Microsoft_PowerToys" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "EclipseAdoptium.Temurin.8.JDK" -Name "EclipseAdoptium_Temurin_JDK_8_Releases" -Type "msi" -Class "Components" Get-WinGetPackageURL -ID "EclipseAdoptium.Temurin.11.JDK" -Name "EclipseAdoptium_Temurin_JDK_11_Releases" -Type "msi" -Class "Components" Get-WinGetPackageURL -ID "EclipseAdoptium.Temurin.17.JDK" -Name "EclipseAdoptium_Temurin_JDK_17_Releases" -Type "msi" -Class "Components" Get-WinGetPackageURL -ID "Python.Python.2" -Name "Python_2_Dev" -Type "msi" -Class "Components" Get-WinGetPackageURL -ID "Python.Python.3.8" -Name "Python_3.8_Dev" -Type "exe" -Class "Components" Get-WinGetPackageURL -ID "Python.Python.3.11" -Name "Python_3.11_Dev" -Type "exe" -Class "Components" # Applications Get-WinGetPackageURL -ID "7zip.7zip" -Name "7_Zip" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Anaconda.Anaconda3" -Name "Anaconda3" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Apple.iTunes" -Name "iTunes" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Audacity.Audacity" -Name "Audacity" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Bandisoft.Bandizip" -Name "Bandizip" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Bandisoft.Honeyview" -Name "Honeyview" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Bitvise.SSH.Server" -Name "Bitvise_SSH_Server" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "BlenderFoundation.Blender" -Name "Blender" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "Codeblocks.Codeblocks" -Name "Codeblocks" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "darktable.darktable" -Name "darktable" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "den4b.Hasher" -Name "Hasher" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "den4b.ReNamer" -Name "ReNamer" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "DEVCOM.JetBrainsMonoNerdFont" -Name "Nerd_Fonts" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "Geany.Geany" -Name "Geany" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "GeekUninstaller.GeekUninstaller" -Name "Geek_Uninstaller" -Type "zip" -Class "Applications" Get-WinGetPackageURL -ID "GIMP.GIMP" -Name "GIMP" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Git.Git" -Name "Git" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "GitHub.Atom" -Name "Atom" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "GitHub.GitHubDesktop" -Name "GitHubDesktop" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "GNU.Octave" -Name "Octave" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "gnuplot.gnuplot" -Name "gnuplot" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Google.Chrome" -Name "Google_Chrome" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "HandBrake.HandBrake" -Name "HandBrake" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Harmonoid.Harmonoid" -Name "Harmonoid" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Henry++.MemReduct" -Name "MemReduct" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "JanDeDobbeleer.OhMyPosh" -Name "Oh_My_Posh" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "KDE.Kate" -Name "Kate" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "KDE.Krita" -Name "Krita" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "KDE.Okular" -Name "Okular" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Kitware.CMake" -Name "CMake" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "LLVM.LLVM" -Name "LLVM" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Meltytech.Shotcut" -Name "Shotcut" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "MHNexus.HxD" -Name "HxD" -Type "zip" -Class "Applications" Get-WinGetPackageURL -ID "Microsoft.VisualStudio.2022.Community" -Name "Microsoft_Visual_Studio_2022_Community" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Microsoft.VisualStudioCode" -Name "Microsoft_Visual_Studio_Code" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Mozilla.Firefox" -Name "Firefox" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "Mozilla.Thunderbird" -Name "Thunderbird" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Musescore.Musescore" -Name "Musescore" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "OBSProject.OBSStudio" -Name "OBSStudio" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Pinta.Pinta" -Name "Pinta" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Piriform.Recuva" -Name "Recuva" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "RealVNC.VNCViewer" -Name "VNCViewer" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Rufus.Rufus" -Name "Rufus" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "ShiningLight.OpenSSL" -Name "OpenSSL" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "SSHFS-Win.SSHFS-Win" -Name "SSHFS" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "Tencent.QQ" -Name "Tencent_QQ" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Tencent.TencentMeeting" -Name "Tencent_Meeting" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "Tencent.WeChat" -Name "Tencent_WeChat" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "TheDocumentFoundation.LibreOffice" -Name "LibreOffice" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "TortoiseGit.TortoiseGit" -Name "TortoiseGit" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "TortoiseHg.TortoiseHg" -Name "TortoiseHg" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "TortoiseSVN.TortoiseSVN" -Name "TortoiseSVN" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "uGetdm.uGet" -Name "uGet" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "VideoLAN.VLC" -Name "VideoLAN_VLC" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "vim.vim" -Name "GVIM" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "voidtools.Everything" -Name "Everything" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "WinFsp.WinFsp" -Name "WinFsp" -Type "msi" -Class "Applications" Get-WinGetPackageURL -ID "WiresharkFoundation.Wireshark" -Name "Wireshark" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "XnSoft.XnConvert" -Name "XnConvert" -Type "exe" -Class "Applications" Get-WinGetPackageURL -ID "ZeroTier.ZeroTierOne" -Name "ZeroTier_One" -Type "msi" -Class "Applications" # 软件包计数:用于对照日志查缺补漏 Write-Output "Total: $Script:PackageCount`n" | Tee-Object $Script:PackageList -Append Write-Output "Write-Output `"Total: `$Script:PackageLocalCount``n`"" | Out-File $Script:PackageScriptIWR -Append Write-Output "Write-Output `"Total: `$Script:PackageLocalCount``n`"" | Out-File $Script:PackageScriptSBT -Append Write-Output "Write-Output `"Total: `$Script:PackageLocalCount``n`"" | Out-File $Script:PackageScriptWCD -Append # 查看日志文件 explorer "${env:LOCALAPPDATA}\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir" Remove-Item "${env:LOCALAPPDATA}\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir\*" -Recurse -Force -Confirm

这段代码的作用是将指定好的软件包的信息从 WinGet 上爬取下来,并自动生成用于下载这些软件包的脚本。将此段代码复制另存为 Get-PackagesInfo.ps1 ,在 PowerShell 中跳转到脚本所在目录运行脚本,若遇到了权限问题,请用管理员权限打开 PowerShell 环境,并正确指定本地计算机的 PowerShell 执行策略(如何配置 PowerShell 执行策略?)

复制并保存代码,可放在任意目录下

完成上述步骤,就可以在 PowerShell 环境下执行这个脚本了:

.\Get-PackagesInfo.ps1

执行后,脚本会自动从 WinGet 配置的源下载安装包的信息,稍等片刻:

脚本正在下载信息

运行完毕后,在当前目录会自动生成 3 个新的 PS 脚本,用于将 Get-PackagesInfo.ps1 这个脚本中指定的软件包按分类从 WinGet 源下载到 PackageInstallers 目录下的分类目录中:

用于下载软件安装包的脚本

这三个脚本的功能完全一致,只是用于下载采用的实现不同:

"Get-PackageInstallersIWR.ps1" 使用 cmdlet Invoke-WebRequest 下载

"Get-PackageInstallersSBT.ps1" 使用 cmdlet Start-BitsTransfer 下载

"Get-PackageInstallersWCD.ps1" 创建 System.Net.WebClient 对象下载

这里选择执行 Get-PackageInstallersSBT.ps1 来进行下载(为了节省时间便于演示,此处删除了一些软件):

.\Get-PackageInstallersSBT.ps1

下载指定的软件包并保存到指定的分类目录下

稍等片刻,下载完成,使用 tree 命令或文件资源管理器查看下载好的安装包:

使用 tree 命令查看下载的安装包

在文件资源管理器查看下载的安装包

可以使用文本比较工具查看安装包是否都下载成功:

文本比较,查看是否有下载失败,可使用正则表达式忽略时间戳


END


2023.11.25 更新

默认区域设置非Unicode程序的本地语言没有设置成UTF-8时需要手动打开更换字符集的设置。代码已更新,默认注释。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 20:50:11

构建AI Agent技能库:从零搭建团队专属的智能助手工具箱

1. 项目概述:构建你的AI Agent技能库如果你和我一样,每天都要和Claude、Cursor、Codex这些AI编程助手打交道,那你肯定也遇到过这样的问题:面对浩如烟海的Agent技能,每次需要用时都得临时去翻找、安装,效率低…

作者头像 李华
网站建设 2026/5/4 20:47:26

星朗智能语音识别——视频转文字

最近在做B站和抖音的视频更新,每次剪辑完最痛苦的环节就是——上字幕!网课录屏、会议录像动辄一两个小时,一边听一边手打字幕真的让人头皮发麻。市面上的视频转文字工具我也试了不少,好用的基本都要你“开通包月/包年会员”&#…

作者头像 李华
网站建设 2026/5/4 20:46:27

通过 OpenClaw 的 CLI 子命令快速写入 Taotoken 配置

通过 OpenClaw 的 CLI 子命令快速写入 Taotoken 配置 1. 准备工作 在开始配置前,请确保已安装 OpenClaw CLI 工具。若尚未安装,可通过 npm 全局安装或使用 npx 直接运行: npm install -g openclaw/cli同时,您需要拥有有效的 Ta…

作者头像 李华
网站建设 2026/5/4 20:42:28

【PhoneCoder】随时随地——掏出手机就能完成开发部署

dockerBot phoneCoder clientCoder — 架构与使用指南(中文版) 本文介绍了一个具备全自动开发和一键部署能力的 AI 智能体系统,其三个子项目:NestJS 后端(dockerBot)、Expo / React Native 客户端&#…

作者头像 李华