1

有没有办法让 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”
}
4

4 回答 4

1

当你这样做时:

$freespace = Read-Host -Prompt 'Please enter a value for Freespace'

存储在$freespace变量中的值将是类型[String],而您可能想要[UInt64](正整数)。您可以使用如下代码将[String]类型转换为类型[UInt64]

do {
  $entry = Read-Host "Please enter a value for freespace, in GB"
  $freespace = $entry -as [UInt64]
  $ok = ($null -ne $freespace) -and ($freespace -lt 1024)
  if ( -not $ok ) {
    Write-Host "Please enter a value in the range 0 to 1023"
  }
until ( $ok )
$freespace *= 1GB

首先,您提示输入 a[String]并将其存储在$entry. 接下来,我们使用运算符​​字符串值转换为一个值。如果转换失败,变量将包含. 循环将重复,直到输入数值。[UInt64]-as$freespace$nulldo

使用脚本中的上述代码,循环完成$freespace后将是一个数值。do最后一行将其转换为 GB。

于 2021-11-18T20:56:40.797 回答
0

您的读取主机是字符串而不是 int 尝试以下

[int]$freespace = Read-Host -Prompt '请输入空闲空间的值'

于 2021-11-18T20:45:56.713 回答
0

要回答原始问题:

有没有办法Read-Host识别 KB、MB、GB、TB 和 PB 等 PowerShell 乘数?

Windows PowerShell在数字文字中识别二进制乘数后缀-kb,mb,gb,tb,pb- ,而不是在(隐式)从 string转换时识别,后者是cmdlet 始终返回的内容。Read-Host

识别字符串形式的唯一上下文是基于运算符的表达式,其中字符串操作数被隐式转换为数字,从而实现了相当简单和安全的解决方法[1]

# 0 + forces the RHS string to be converted to a number, which
# in this particular context *does* work with binary multiplier suffixes 
PS> 0 + '1kb'
1024

此解决方法也适用于PowerShell (Core) 7+,但您可以简单地使用
[long] '1kb'
,因为现在在隐式到数字转换期间始终支持此类字符串。

应用于您的代码:

while ($true) {
  try { 
    $freeSpace = 0 + (Read-Host -Prompt 'Please enter a value for Freespace')
    break # Valid input received; exit the loop.
  } catch { 
    Write-Warning 'Please enter a valid number.' # Prompt again.
  }
}

If ($freeSpace -lt 5GB) {
    "Free disk space is less than 5 GB"
} ElseIf ($freeSpace -lt 10GB) {
    "Free disk space is less than 10 GB"
} ElseIf ($freeSpace -lt 20GB) {
    "Free disk space is less than 20 GB"
} Else {
    "Free disk space is more than 20 GB"
}

[1] 虽然使用Invoke-Expression( ) 在技术上也可以工作,但由于其固有的安全风险,iex通常应避免使用此 cmdlet,并且仅将其用作最后的手段。通常有更好的替代品。如果真的别无选择,请仅在您自己提供或完全信任的输入中使用它 - 请参阅此答案

于 2021-11-18T21:51:44.370 回答
0

更正

$freeSpace = $null
do {
 [int]$freeSpaceRaw = Read-Host -Prompt 'Please enter a value for Freespace in GB example 5 for 5GB '
  try { $freeSpace = 0 + $freeSpaceRaw } catch { Write-Warning 'Please enter a valid number.' }
} while ($null -eq $freeSpace)

If ($freeSpace -lt 5) {
    "Free disk space is less than 5 GB"
} ElseIf ($freeSpace -lt 10) {
    "Free disk space is less than 10 GB"
} ElseIf ($freeSpace -lt 20) {
    "Free disk space is less than 20 GB"
} Else {
    "Free disk space is more than 20 GB"
}
于 2021-11-18T22:25:46.473 回答