1. 什么是 WinGet微软公司在 2020 年 5 月 Microsoft Build 开发者大会上发布了用于 Windows 系统的官方支持的软件包管理器 —— Windows 软件包管理器Windows Package Manager也就是 WinGet 软件包管理器。经过 3 年的发展越来越多的软件厂商在这个平台上发布自家软件。WinGet 除了支持 exe、msi 等传统的 Win32 安装包格式外还支持用于新版 Windows 的 msix/msixbundle 格式所打包的软件。​编辑Windows 软件包管理器WinGetlearn.microsoft.com/en-us/windows/package-manager2. 获取 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?hlen-usglusWindows Terminal - GitHubgithub.com/microsoft/terminal/releasesWinGet​编辑WinGet - Microsoft Storeapps.microsoft.com/store/detail/app-installer/9NBLGGH4NNS1?hlen-usglusWinGet - GitHubgithub.com/microsoft/winget-cli/releases2.2 Windows10/11 LTS 版本长期服务频道企业版 LTSCIoT 企业版 LTSC如果使用了 Windows LTSC 版本的系统需要先安装一个 Microsoft Store 的环境才能安装 Windows Terminal 和 WinGet。CTRLSHIFTESC 呼出任务管理器打开详细信息界面任务管理器从菜单栏运行新任务文件 --gt; 运行新任务勾选管理员权限输入 conhost 或 cmd打开命令行窗口以管理员权限创建新任务命令行窗口输入命令wsreset.exe -i使用命令安装 Microsoft Store等待运行完成待到窗口重新出现命令提示符以后开始菜单出现了 Microsoft Store 的图标就可以参考 Windows10/11 非 LTS 版本的安装方法安装 Windows Terminal 和 WinGet 。2.3 设置 Windows Terminal 为系统默认终端模拟器较新版本的 Windows11 已经默认 Windows Terminal 为系统终端模拟器如已配置好请略过此章节。从命令行窗口标题栏右键菜单进入默认设置打开命令提示符的默认设置在【终端】选项卡下更改“默认终端应用程序”为“Windows 终端”确认退出终端 --gt; 更改默认终端应用程序3. 使用 WinGet 管理软件3.1 概述使用 WinGet大多数软件就可以像 Linux 发行版的软件安装方式一样可以通过 apt/apt-get、yum、pacman 等命令在终端模拟器中以一条命令即可做到。很多大佬已经写过 WinGet 的使用教程再加之微软官方给出的参考文档和实例也已经十分详实这里就不再赘述只列举几个最常用的命令以开源压缩软件 7-Zip 举例。​编辑WinGet 使用帮助learn.microsoft.com/en-us/windows/package-manager/winget3.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 7zipWinGet 搜索软件3.4 常用命令查看软件包winget show --id 7zip.7zipWinGet 查看软件信息3.5 常用命令安装软件包winget install --id 7zip.7zip --rainbowWinGet 安装软件时“--rainbow”参数可以开启彩虹特效进度条3.6 常用命令更新软件包winget upgrade --id 7zip.7zip --rainbowWinGet 更新软件时“--rainbow”参数可以开启彩虹特效进度条3.7 常用命令卸载软件包winget uninstall --id 7zip.7zipWinGet 卸载软件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软件详情关于 WingetUI4.2 获取和使用 WingetUI既然有了 WinGet 就可以直接从 WinGet 安装 WingetUIwinget install --id SomePythonThings.WingetUIStore --rainbow通过 WinGet 安装 WingetUI如果遇到网络问题等不方便直接从 WinGet 下载安装的情况还可以使用网络正常的电脑下载 WingetUI 安装包到本地再拷贝回目标设备安装WingetUI 安装程序github.com/marticliment/WingetUI/releases/latest/download/WingetUI.Installer.exeWingetUI 本地安装程序界面安装完成后从桌面或开始菜单启动 WingetUI 即可使用图形界面管理软件。WingetUI 软件界面WingetUI 的使用十分简单与直观这里不做赘述。来自作者帮助文档链接如下WingetUI 帮助文档github.com/marticliment/WingetUI/wiki5 使用 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?hlen-usglusPowerShell - GitHubgithub.com/PowerShell/PowerShell部署好 PowerShell 后用任意文本编辑器Nodepad、VSC、Geany、VIM 等编写用于直接从 WinGet 源获取软件安装包信息的脚本此处已添加一些开发人员常用的应用程序和工具如 VCRuntime、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:PackageURLn, ┗━ $Private:PackageLocalFilen) | Write-Output Write-Output ┏━ $Private:PackageUpdateTime $Private:PackageWinGetID [$Private:PackageVersion]n┣━ $Private:PackageURLn┗━ $Private:PackageLocalFilen | 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:PackageCountn | Tee-Object $Script:PackageList -Append Write-Output Write-Output Total: $Script:PackageLocalCountn | Out-File $Script:PackageScriptIWR -Append Write-Output Write-Output Total: $Script:PackageLocalCountn | Out-File $Script:PackageScriptSBT -Append Write-Output Write-Output Total: $Script:PackageLocalCountn | 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 命令查看下载的安装包在文件资源管理器查看下载的安装包可以使用文本比较工具查看安装包是否都下载成功文本比较查看是否有下载失败可使用正则表达式忽略时间戳END2023.11.25 更新默认区域设置非Unicode程序的本地语言没有设置成UTF-8时需要手动打开更换字符集的设置。代码已更新默认注释。