我必须根据他们的成绩来推断学生的毕业年份。他们的学生身份证号码中有2位数的毕业年份,但这证明是不准确的,有时是由于学生被拖延和其他基于身份证号码的异常。
我为我编写了一个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年级(预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‘的实例。
发布于 2022-03-11 19:07:38
注:我不能重现你的具体症状,但以下建议仍然值得注意。
类型约束您的$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从未引用的参数(如2和-2 )中推断某些类型,也许令人惊讶的是,2变成了[int],而-2变成了[string] (强制后者被解释为[int] ad,将其传递为(-2))。
许多PowerShell运算符(如-eq / ne和-lt / -le / -gt / ge )都可以对字符串和数字进行操作,通常是由LHS操作数的类型决定整个操作的数据类型。
下面是一个例子,说明这会产生什么影响:
2 -lt 10 # $true
'2' -lt 10 # !! $false, due to *lexical* comparisonhttps://stackoverflow.com/questions/71443458
复制相似问题