You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用Azure CLI执行backup命令提示VMNAME未识别如何解决

问题根源

你遇到的报错由三个核心问题导致:

  1. 你定义的query变量完全没有传入subprocess.Popen的参数列表,相当于执行az命令时根本没加--query参数,自然无法识别VMNAME相关逻辑
  2. az命令少了list子命令,和终端执行的完整命令结构不一致
  3. 没有显式指定az命令的输出格式为json,命令报错时输出的纯文本内容无法被json解析器处理,就会触发JSONDecodeError
  4. 字符串转义冗余:用列表形式传参给subprocess时,query里的单引号不需要加反斜杠转义,直接写即可。

修复后的完整代码

from azure.cli.core import get_default_cli
import subprocess
import json


#VARS
AZCLIusr="CREDENTIALS"
AZCLIpwd="CREDENTIALS"
AZCLItenant="CREDENTIALS"
#######
print("#### LOGIN AZ #####")
get_default_cli().invoke(['login', '--service-principal', '--username', str(AZCLIusr), '-p', str(AZCLIpwd), '--tenant', str(AZCLItenant)])

print ("### VM LIST COMMAND #####")

##VARS##
rgAZ="RESOURCEGROUPNAME"
startDate="30-08-2021"
# 单引号不需要额外转义
query="[?contains(properties.containerName, 'VMNAME')].properties.status"
####

# 补全list子命令、添加query参数、显式指定json输出格式
process = subprocess.Popen([
    'az','backup', 'job', 'list',
    '--resource-group', rgAZ,
    '--start-date', startDate,
    '--vault-name', 'myRecoveryServicesVault',
    '--query', query,
    '-o', 'json'
], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()

# 先判断命令执行状态再解析,避免异常崩溃
if process.returncode == 0:
    jsonLoads = json.loads(out)
    print("### PRINT JSON FORMAT #####")
    print(json.dumps(jsonLoads, indent=4, sort_keys=True))
    print("### PRINT STRING FORMAT #####")
    print(jsonLoads)
else:
    print("命令执行错误,错误信息:", err.decode('utf-8'))

内容的提问来源于stack exchange,提问作者RCat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:27:00