有沒有辦法讓 Read-Host 識別 PowerShell 乘數,如 KB、MB、GB、TB 和 PB?如果我手動填充 $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”
}
uj5u.com熱心網友回復:
當你這樣做時:
$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. 接下來,我們投的字串值的[Int]使用值-as運算子。如果轉換失敗,$freespace變數將包含$null. 該do回圈將重復,直到進入數字值。
使用腳本中的上述代碼,回圈完成$freespace后將是一個數值do。最后一行將其轉換為 GB。
uj5u.com熱心網友回復:
您的讀取主機是一個字串而不是一個 int 嘗試以下
[int]$freespace = Read-Host -Prompt '請輸入 Freespace 的值'
uj5u.com熱心網友回復:
更正
$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"
}
uj5u.com熱心網友回復:
Windows PowerShell僅識別數字文字中的二進制乘數后綴 - kb, mb, gb, tb, pb- ,而不識別(隱式)從字串轉換時,后者是cmdlet 始終回傳的內容。Read-Host
其中的字串形式的唯一背景關系被公認是一種基于運營商的表達,其中的字串運算元被隱式轉換為數字,這使得能夠相當簡單和安全的解決方法。[1]
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,并且僅將其用作最后的手段。通常有更好的替代品。如果確實別無選擇,請僅在您自己提供或完全信任的輸入中使用它 - 請參閱此答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362655.html
