如何解决 Azure Pipelines 中 Azure CLI 的 cp1252 编码警告?
结论
报错提示 Azure CLI 正在使用 cp1252 编码输出,但项目数据中包含韩文字符,cp1252 无法表示这些字符,因此它们可能会被丢弃。建议在启动 Azure CLI 的任务环境中启用 Python UTF-8 模式,并确保 PowerShell 与子进程使用 UTF-8。LANG: 'en_US.UTF-8' 在 Windows 上不一定会改变进程实际使用的编码。
在启动脚本前设置 UTF-8
可以在 PowerShell 脚本开头设置以下环境变量和编码,然后执行 az:
$env:PYTHONUTF8 = '1'
$env:PYTHONIOENCODING = 'utf-8'
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$OutputEncoding = [Console]::OutputEncoding
$projects = az devops project list `
--organization "https://dev.azure.com/$org_name/" `
--output json | ConvertFrom-Json
也可以在 PowerShell@2 任务的 env 中添加环境变量:
- task: PowerShell@2
displayName: 'Run Integration Script'
env:
POWERSHELL_TELEMETRY_OPTOUT: '1'
PYTHONUTF8: '1'
PYTHONIOENCODING: 'utf-8'
inputs:
targetType: 'filePath'
filePath: '$(Build.SourcesDirectory)/directorypath/schedule-integration.ps1'
arguments: '-pat_token "$(pattoken)"'
pwsh: true
failOnStderr: true
PYTHONUTF8 和 PYTHONIOENCODING 必须在启动 az 进程前设置。示例将 pwsh 设为 true,以使用 PowerShell 7。如果必须继续使用 Windows PowerShell,可以保留 pwsh: false,并在脚本中设置这些编码。具体效果可能因 Azure CLI 的启动方式和版本而异,需检查任务日志和实际解析结果。
检查输出是否完整
修复后,可以检查解析出的项目字段是否保留了非 ASCII 字符:
$projects | Select-Object -First 5 name, description
如果脚本只需要项目名称和 ID,可以在 Azure CLI 输出时筛选字段,减少包含非 ASCII 文本的字段:
$projects = az devops project list `
--organization "https://dev.azure.com/$org_name/" `
--query '[].{id:id,name:name}' `
--output json | ConvertFrom-Json
只有在后续逻辑不需要 description 等其他字段时,才适合使用这种方式。它可以缩小输出范围,但不能替代对编码问题的处理。
关于 stderr 重定向
3>$null 是 PowerShell 的文件描述符重定向语法,可能会隐藏诊断信息,但不一定能修正 Azure CLI 的字符编码。管道任务设置了 failOnStderr: true,如果警告写入 stderr,任务也可能因此失败。不要只为消除告警而丢弃整个错误流。先让 Azure CLI 在 UTF-8 环境中输出,再根据实际日志判断是否仍有错误。
备注:内容仅供参考。
