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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:32:50