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

PowerShell脚本检测VM动态内存时遇ReadOnly Property错误求助

解决PowerShell脚本中'DynamicMemoryEnabled'只读属性报错问题

错误原因

报错的核心是条件判断里误用了赋值运算符:if($VM.DynamicMemoryEnabled = $false) 中的单等号=是赋值操作,而DynamicMemoryEnabled是只读属性,无法被赋值,因此触发了ReadOnly property错误。

解决步骤

1. 修正条件判断运算符

将赋值操作改为比较操作,有两种写法:

  • 标准比较:if($VM.DynamicMemoryEnabled -eq $false)
  • 更简洁的布尔取反:if(!$VM.DynamicMemoryEnabled)(推荐,因为属性本身是布尔值)

2. 优化冗余代码(可选但推荐)

你的脚本中if和else块有大量重复逻辑(比如格式化输出、生成对象),可以提取公共代码减少冗余,提升可维护性。

修正后的脚本片段

# Get virtual machines
$VMselection = Get-SCVirtualMachine | Where-Object {$_.Name -like "$searchVM"}
$VMs = $VMselection

# 初始化结果数组(用于后续绑定DataGridView)
$results = @()

# 遍历虚拟机
foreach($VM in $VMs){
    # 根据动态内存状态获取内存值
    if(!$VM.DynamicMemoryEnabled){
        $MemorySize = $VM.Memory / 1024
    }
    else{
        $MemorySize = $VM.DynamicMemoryMaximumMB / 1024
    }

    # 统一处理输出逻辑
    $ProcessorCount = $VM.CPUCount
    # 用三元运算符简化内存单位判断
    $MemoryUnit = $VM.DynamicMemoryEnabled ? "d" : "s"
    # 格式化输出(保留两位小数让结果更清晰)
    $Output = "{0}c / {1:0.00}G{2}" -f $ProcessorCount, $MemorySize, $MemoryUnit

    # 生成结果对象并添加到数组
    $results += [PSCustomObject]@{
        Servername = $VM.Name
        "CPU / RAM" = $Output
    }
}

# 后续可将$results绑定到DataGridView的数据源
# 示例:$dataGridView.DataSource = $results

优化说明

  • 移除了Out-Null:因为后续要展示到DataGridView,需要保留生成的对象,因此将结果收集到$results数组中
  • 用三元运算符替代冗余的if-else判断内存单位,简化代码
  • 格式化内存值时保留两位小数,输出更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:26:17