PAYATHON 2026

如何解决 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 环境中输出,再根据实际日志判断是否仍有错误。

备注:内容仅供参考。