powershell 通过describe-alarms API aws获取警报详细信息时出现编码问题

5ktev3wc  于 2023-10-18  发布在  Shell
关注(0)|答案(1)|浏览(122)

遇到一个奇怪的问题,而使用aws的powershell一次又一次地只在美国东部地区1,但其他地区的脚本工作正常。
我试图建立一个逻辑,以获取现有的报警细节与下面的脚本的帮助:

$alarmNames = aws cloudwatch --profile $profile --region $region describe-alarms --query MetricAlarms[].AlarmName[] --output json | ConvertFrom-Json

这给了我一个奇怪的错误,即。

aws : 
At line:525 char:15
+ ... larmNames = aws cloudwatch --profile $awsProfile --region $awsRegion  ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
'charmap' codec can't encode character '\uf13f' in position 75: character maps to <undefined>
ConvertFrom-Json : Invalid array passed in, ',' expected. (7840): [
Write-Output ( "data type is "+$alarmNames.GetType())

和abobe错误是指向我在这一行,但同样的工作没有任何编码问题,在其他地区
$alarmNames = aws cloudwatch --profile $profile --region $region describe-alarms --query MetricAlarms[].AlarmName[] --output json| ConvertFrom-Json
上面的查询是取出**System.Object[]**type数据类型
任何输入或想法,我应该如何避免这个异常/错误在我的powershell aws脚本?

c3frrgcw

c3frrgcw1#

这听起来像是aws.exe在幕后使用Python,并且要打印到stdout的文本包含无法以隐含的输出字符编码进行编码的Unicode字符(请注意,输出中的PRIVATE USE-F13 F,U+F13F)字符肯定是不寻常的)。

  • 也许 * 以下内容有助于[更新-看起来,它没有帮助,尽管答案至少应该适用于一般的Python] -我无法亲自验证它:

在从PowerShell调用aws之前执行以下操作:

  • 通过如下设置PYTHONIOENCODING环境变量(默认情况下没有定义),告诉 Python 生成 * UTF-8输出(根据定义,它能够编码 * 所有 * Unicode字符):
$env:PYTHONIOENCODING='utf-8'
  • 注意:这里假设aws.exe使用与直接使用Python相同的环境变量。
  • 告诉 PowerShell 将 * aws.exe输出解释为UTF-8编码,以确保它被正确解码为.NET字符串:
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()

要将所有设置组合在一起,包括保存和恢复以前的设置:

# Save the current settings.
$prevEnvVar = $env:PYTHONIOENCODING; $prevEnc = [Console]::OutputEncoding

# Tell aws.exe / Python to output UTF-8.
$env:PYTHONIOENCODING='utf-8'
# Tell PowerShell to interpret the output from external programs
# such as aws.exe as UTF-8.
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()

# Make the aws call, whose output should now be UTF-8 and which
# PowerShell should interpret as such.
$alarmNames = 
  aws cloudwatch --profile $profile --region $region describe-alarms --query MetricAlarms[].AlarmName[] --output json |
    ConvertFrom-Json

# Restore the previous settings.
$env:PYTHONIOENCODING = $prevEnvVar; [Console]::OutputEncoding = $prevEnc

相关问题