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_
相关产品推荐
相关产品推荐

