如何在PowerShell中正确存储GB单位内存变量适配New-VM cmdlet
解决PowerShell New-VM内存参数字符串转换问题
错误原因
New-VM的-MemoryStartupBytes参数要求传入64位整数(System.Int64),代表内存的字节总数。而Read-Host返回的是纯字符串类型,直接传递带单位的字符串(如"4GB")无法被自动转换为Int64,因此触发类型转换错误。
解决方法
根据用户输入习惯,提供两种可靠的处理方式:
方式1:固定单位为GB,用户输入纯数字
让用户仅输入数字(如4代表4GB),脚本自动转换为字节数:
$VMName = Read-Host -Prompt 'VM Name' $MemoryGB = Read-Host -Prompt 'Set Memory Allocation (GB)' # 将输入的数字转换为Int64类型的字节数 $MemoryBytes = [long]$MemoryGB * 1GB $VMDirectory = 'C:\My VMs' New-VM -Name $VMName -MemoryStartupBytes $MemoryBytes -Path $VMDirectory -Generation 2 -SwitchName $SwitchName -NoVHD
方式2:支持带单位的输入(如4GB、512MB)
通过正则验证输入格式,再解析为字节数(避免Invoke-Expression的安全风险):
$VMName = Read-Host -Prompt 'VM Name' $MemoryInput = Read-Host -Prompt 'Set Memory Allocation (e.g. 4GB or 512MB)' # 验证输入格式,仅允许数字加合法单位(GB/MB/KB/B) if ($MemoryInput -match '^(\d+)(GB|MB|KB|B)$') { $memoryValue = [long]$matches[1] $memoryUnit = $matches[2] # 根据单位计算字节数 switch ($memoryUnit) { 'GB' { $MemoryBytes = $memoryValue * 1GB } 'MB' { $MemoryBytes = $memoryValue * 1MB } 'KB' { $MemoryBytes = $memoryValue * 1KB } 'B' { $MemoryBytes = $memoryValue } } } else { Write-Error "无效的内存格式,请输入类似'4GB'或'512MB'的内容。" exit 1 } $VMDirectory = 'C:\My VMs' New-VM -Name $VMName -MemoryStartupBytes $MemoryBytes -Path $VMDirectory -Generation 2 -SwitchName $SwitchName -NoVHD
关键要点
- 无论哪种方式,最终必须传递Int64类型的字节数给
-MemoryStartupBytes参数 - 若允许带单位输入,优先用正则+分支判断的方式解析,避免使用
Invoke-Expression(存在代码注入风险)
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

