Azure虚拟机中Invoke-AzVMRunCommand执行winget命令无响应问题求助
解决Azure VM通过Invoke-AzVMRunCommand执行winget无响应的问题
核心原因
Invoke-AzVMRunCommand以**系统账户(NT AUTHORITY\SYSTEM)**身份执行脚本,手动安装的winget默认仅对登录用户可见,系统账户无法定位到winget可执行文件;同时winget部分操作默认需要交互式确认,在系统账户环境下会因无交互输入而静默终止。
解决方案步骤
1. 指定winget完整路径调用
手动安装的winget通常位于用户目录(如C:\Users\<你的用户名>\AppData\Local\Microsoft\WindowsApps\winget.exe),系统账户无法访问该路径,需在脚本中明确指定完整路径:
Invoke-AzVMRunCommand -ResourceGroupName $rgName -VMName $vmName -CommandId 'RunPowerShellScript' -ScriptString '& "C:\Users\<你的用户名>\AppData\Local\Microsoft\WindowsApps\winget.exe" --version'
若通过Microsoft Store安装winget,可动态获取系统级路径:
Invoke-AzVMRunCommand -ResourceGroupName $rgName -VMName $vmName -CommandId 'RunPowerShellScript' -ScriptString ' $wingetPath = Get-ChildItem -Path "C:\Program Files\WindowsApps" -Filter "winget.exe" -Recurse | Select-Object -First 1 -ExpandProperty FullName & $wingetPath --version '
2. 添加非交互式参数
winget的安装、升级操作默认需要用户确认协议,需添加--accept-package-agreements和--accept-source-agreements参数跳过交互:
Invoke-AzVMRunCommand -ResourceGroupName $rgName -VMName $vmName -CommandId 'RunPowerShellScript' -ScriptString ' $wingetPath = Get-ChildItem -Path "C:\Program Files\WindowsApps" -Filter "winget.exe" -Recurse | Select-Object -First 1 -ExpandProperty FullName & $wingetPath install Microsoft.Azure.StorageExplorer --accept-package-agreements --accept-source-agreements '
3. 部署系统级winget(推荐)
将winget复制到系统目录,让所有账户(含系统账户)可直接调用:
- 本地登录VM,以管理员身份打开PowerShell
- 执行复制命令:
$sourcePath = Get-ChildItem -Path "C:\Program Files\WindowsApps" -Filter "winget.exe" -Recurse | Select-Object -First 1 -ExpandProperty FullName $targetPath = "C:\Windows\System32\winget.exe" Copy-Item -Path $sourcePath -Destination $targetPath -Force
之后可直接在RunCommand中使用简化命令:
Invoke-AzVMRunCommand -ResourceGroupName $rgName -VMName $vmName -CommandId 'RunPowerShellScript' -ScriptString 'winget upgrade --all --accept-package-agreements --accept-source-agreements'
4. 验证执行结果
通过输出重定向确认命令执行状态:
Invoke-AzVMRunCommand -ResourceGroupName $rgName -VMName $vmName -CommandId 'RunPowerShellScript' -ScriptString ' $wingetPath = Get-ChildItem -Path "C:\Program Files\WindowsApps" -Filter "winget.exe" -Recurse | Select-Object -First 1 -ExpandProperty FullName & $wingetPath --version > C:\temp\winget_log.txt 2>&1 Get-Content C:\temp\winget_log.txt '
返回结果中会显示winget版本信息,确认命令是否成功执行。
内容的提问来源于stack exchange,提问作者iflach
相关产品推荐
相关产品推荐

