我必須根據他們的年級來推斷學生的畢業年份。他們的學生 ID 號中有 2 位數的畢業年份,但事實證明,有時由于學生被推遲和其他基于 ID 號的例外情況,這有時是不準確的。
我撰寫了一個 powershell 腳本來為我執行此操作,作為一個更大腳本的一部分,以獲取從 powerschool 匯出的 CSV 并根據他們的畢業年份檢查他們在活動目錄中的位置。我遇到問題的腳本部分如下:
function GradeToYog($grade){ # converts grade number to year of grad because IDNUM is not a reliable indicator of grad year
if($grade -ne $null){
# get current date
$date = Get-Date
# account for time of year, add 1yr offset to grad year if september or later
$offset = 0
if($date.month -ge 9){
$offset = 1
}
# Account for placement of extended-stay students such as SPED kids
if($grade -gt 12){
$grade = 12
}
return ($date.year 12 $offset - $grade)
} else {
return "Invalid entry."
}
}
這適用于-1(pre-K)到12年級,但是當我針對-2進行測驗時它會中斷:
PS C:\> GradeToYog 12
2022
PS C:\> GradeToYog 9
2025
PS C:\> GradeToYog 6
2028
PS C:\> GradeToYog 3
2031
PS C:\> GradeToYog 1
2033
PS C:\> GradeToYog 0
2034
PS C:\> GradeToYog -1
2035
PS C:\> GradeToYog -2
2022
奇怪的是,如果我在 powershell 中針對相同的邏輯測驗預期值,它會起作用:
PS C:\> 2022 12 0 - -2
2036
我搜索了類似的問題,但要么我沒有正確搜索它,要么似乎沒有 powershell 的實體錯誤地減去“-2”
uj5u.com熱心網友回復:
注意:我無法重現您的具體癥狀,但以下建議仍然值得關注。
型別約束您的$grade引數以確保它是一個數字:
# Make sure that $grade is an [int] (System.Int32) value
function GradeToYog([int] $grade) { # ...
# Alternative syntax, with a param(...) block,
# which makes it easier to use validation attributes.
function GradeToYog {
param(
[ValidateRange(-2, 15)] # Constrain the range of allowable numbers.
[int] $grade
)
# ...
}
一個不受約束的引數實際上是相同的[object] $grade,即它可以接收任何型別的物件。
PowerShell從未參考的引數中推斷出某些型別,例如2and-2和,也許令人驚訝的是,2變成了一個[int],而-2變成了一個[string](強制后者被解釋為一個[int] ad hoc,將它傳遞為(-2))。
許多 PowerShell 運算子,例如-eq/ne和-lt/ -le/ -gt/ge可以同時對字串和數字進行操作,通常是 LHS 運算元的型別決定了整體操作的資料型別。
這是一個例子,說明這會有所不同:
2 -lt 10 # $true
'2' -lt 10 # !! $false, due to *lexical* comparison
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/444149.html
