PowerShell中Read-Host无法识别KB/MB/GB等单位乘数的问题咨询
解决方案
PowerShell 中的1KB/1MB这类带单位的写法属于字面量常量语法,仅在代码硬编码时会被解释器自动解析为对应字节数的整数。Read-Host返回的所有内容默认都是字符串类型,不会自动触发字面量解析逻辑,所以直接对比会出现类型不匹配的问题。
方案1:最简快速方案(适合自用脚本)
直接用Invoke-Expression解析用户输入的字符串,触发PowerShell的字面量解析逻辑:
$freespace = Invoke-Expression (Read-Host -Prompt '请输入可用空间阈值') If ($freeSpace -le 5GB) { Write-Host "可用磁盘空间小于5 GB" } ElseIf ($freeSpace -le 10GB) { Write-Host "可用磁盘空间小于10 GB" } ElseIf ($freeSpace -le 20GB) { Write-Host "可用磁盘空间小于20 GB" } Else { Write-Host "可用磁盘空间大于20 GB" }
注意:这个方案存在安全风险,如果用户输入的不是带单位的数值,而是任意PowerShell代码,都会被直接执行。如果脚本仅自己使用、不会被不可信的人调用,这个方案最简单直接。
方案2:安全解析方案(适合公开使用的脚本)
通过正则匹配提取数值和单位,手动换算成字节数,避免执行任意代码:
$inputStr = Read-Host -Prompt '请输入可用空间阈值' # 正则匹配数值和单位,支持B/KB/MB/GB/TB/PB,不区分大小写 if ($inputStr -match '^\s*(\d+(?:\.\d+)?)\s*([KMGTP]?B)?\s*$') { $value = [double]$matches[1] $unit = $matches[2] ?? 'B' $freespace = switch ($unit.ToUpper()) { 'KB' { $value * 1KB } 'MB' { $value * 1MB } 'GB' { $value * 1GB } 'TB' { $value * 1TB } 'PB' { $value * 1PB } default { $value } } } else { Write-Error "输入格式不合法,请输入类似 10GB、512MB 格式的数值" exit 1 } # 后续判断逻辑不变 If ($freeSpace -le 5GB) { Write-Host "可用磁盘空间小于5 GB" } ElseIf ($freeSpace -le 10GB) { Write-Host "可用磁盘空间小于10 GB" } ElseIf ($freeSpace -le 20GB) { Write-Host "可用磁盘空间小于20 GB" } Else { Write-Host "可用磁盘空间大于20 GB" }
这个方案会先校验输入格式,只有符合数值+单位的合法输入才会被解析,不会执行任意代码,安全性更高。
内容的提问来源于stack exchange,提问作者Christian McGhee
相关产品推荐
相关产品推荐

