【发布时间】:2021-11-18 20:30:44
【问题描述】:
有没有办法让 Read-Host 识别 KB、MB、GB、TB 和 PB 等 PowerShell 乘数?如果我手动填充 $freespace 变量,第一个示例可以正常工作,但在使用 Read-Host 填充 $freespace 变量的第二个示例中不起作用。必须是一个简单的解决方案,以便提示用户输入并将值识别为整数而不是字符串。
#this works just fine. The PowerShell multiplier GB is recognized if typed in.
$freespace = 6GB
If ($freeSpace -le 5GB) {
Write-Host “Free disk space is less than 5 GB”
} ElseIf ($freeSpace -le 10GB) {
Write-Host “Free disk space is less than 10 GB”
} ElseIf ($freeSpace -le 20GB) {
Write-Host “Free disk space is less than 20 GB”
} Else {
Write-Host “Free disk space is more than 20 GB”
}
#This does not work. The variable is populated by Read-Host as a [string]
$freespace = Read-Host -Prompt 'Please enter a value for Freespace'
If ($freeSpace -le 5GB) {
Write-Host “Free disk space is less than 5 GB”
} ElseIf ($freeSpace -le 10GB) {
Write-Host “Free disk space is less than 10 GB”
} ElseIf ($freeSpace -le 20GB) {
Write-Host “Free disk space is less than 20 GB”
} Else {
Write-Host “Free disk space is more than 20 GB”
}
【问题讨论】:
-
$freespace = Invoke-Expression $freespace。在这里使用 iex 因为我不确定 调用运算符 在这种情况下是否可以工作(&)(不在我的办公桌上进行测试 )。您正在向它传递一个字符串,它将被按原样读取。您必须允许执行表达式。 -
@AbrahamZinala - 这会起作用,但它也会执行
remove-item c:\* -rec -force -ea continue。根据脚本呈现给用户的方式,这可能存在安全风险。 -
@Lieven,不确定如何根据显示为 “请输入可用空间的值” 的提示输入整个 cmdlet。与只是说在 shell 本身中执行
Remove-Item c:\ -Recurse会很危险没有什么不同......但是,我明白你的意思。我们可以通过解析数据并评估传递给变量的内容来解决它。你会推荐什么? -
通常的解决方法是转换为数值。一种安全的方法是使用
-as运算符(请参阅我的答案)。 -
@AbrahamZinala - 我应该更多地关注取决于脚本如何呈现给用户。如果脚本使用备用凭据运行,它可能允许用户执行他无权执行的命令。
标签: powershell read-host