如何在Windows 10无人值守安装后运行WinGet部署PowerShell脚本?
Windows 10无人值守安装后触发WinGet应用部署脚本的方案
一、无人值守安装触发脚本的可行方法
1. 用NTLite直接配置首次执行任务
你用的是NTLite,直接在工具里配置最方便:
- 打开NTLite加载你的Windows 10镜像,进入「无人值守」模块
- 找到「首次登录」或「开机启动」相关设置,把你的PowerShell脚本(或打包后的exe)添加为用户首次登录时自动执行的程序
- 脚本要提前放到镜像的固定路径,比如
C:\Windows\Setup\Scripts——这个目录下的脚本会在系统安装完成、用户首次登录前自动运行,注意要给脚本足够的权限 - 也可以通过NTLite的「注册表」模块,给
HKLM\Software\Microsoft\Windows\CurrentVersion\Run添加一个新项,值设为powershell.exe -ExecutionPolicy Bypass -File "C:\你的脚本路径\Install-Apps.ps1",如果需要只执行一次,可以在脚本末尾添加删除该注册表项的逻辑
2. 编辑无人值守XML文件
如果手动维护无人值守XML,在<FirstLogonCommands>节点下添加执行命令:
<FirstLogonCommands> <SynchronousCommand wcm:action="add"> <CommandLine>powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\Install-Apps.ps1"</CommandLine> <Description>批量安装WinGet应用</Description> <Order>1</Order> </SynchronousCommand> </FirstLogonCommands>
- 记得提前把脚本放到镜像的对应路径,或者在XML里加
<CopyCommand>先把脚本复制到目标系统
3. 批量部署场景用WDS后期任务
如果用Windows部署服务(WDS)分发镜像,可以在部署流程的最后阶段添加自定义任务,触发脚本执行,适合多设备批量部署的情况
二、你的PowerShell脚本优化建议
1. 修复弹窗返回值问题
原来用SET-CLIPBOARD处理返回值没必要,直接把输出丢到null即可:
function GW($myinput){ $WS = New-Object -ComObject "Wscript.Shell" $null = $ws.popup($myinput,3,'TK Installer',64) }
2. 修正循环逻辑错误
你的$myapps是数组,不需要用Split(','),直接用foreach循环更简单:
foreach ($aa in $myapps) { GW "正在安装 $aa`n请稍候..." winget install $aa --silent --accept-package-agreements --accept-source-agreements --force }
3. 添加错误日志
可以加个日志记录,方便排查安装失败的应用:
foreach ($aa in $myapps) { GW "正在安装 $aa`n请稍候..." try { winget install $aa --silent --accept-package-agreements --accept-source-agreements --force "$(Get-Date): $aa 安装成功" | Out-File "C:\WinGet安装日志.txt" -Append } catch { "$(Get-Date): $aa 安装失败 - $_" | Out-File "C:\WinGet安装日志.txt" -Append GW "$aa 安装失败`n请查看日志了解详情" } }
三、更优实现方案
1. 用WinGet配置清单批量安装
WinGet支持用YAML或JSON配置文件批量导入应用,比写PowerShell循环更简洁:
创建WinGet安装清单.yaml:
# yaml-language-server: $schema=https://aka.ms/winget-manifest.singleton.1.0.0.schema.json PackageIdentifier: Microsoft.Winget.Source PackageVersion: 1.0.0 Commands: - install Microsoft.PowerShell --silent --accept-package-agreements --accept-source-agreements --force - install Microsoft-Windows.Terminal --silent --accept-package-agreements --accept-source-agreements --force # 把你的其他应用依次添加到这里
然后执行命令:winget import -i WinGet安装清单.yaml即可批量安装
2. 离线部署适配
如果部署环境没网络,提前下载WinGet的应用安装包和本地源,放到镜像或共享目录,用winget source add添加本地源,避免依赖网络
3. 封装为预配包
把脚本、WinGet和必要的依赖打包成Provisioning Package(预配包),在无人值守安装时应用,适合企业级标准化部署
内容的提问来源于stack exchange,提问作者J. Breneman
相关产品推荐
相关产品推荐

