首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当减去-2时,Powershell的毕业年计算中断。

当减去-2时,Powershell的毕业年计算中断。
EN

Stack Overflow用户
提问于 2022-03-11 18:59:40
回答 1查看 42关注 0票数 1

我必须根据他们的成绩来推断学生的毕业年份。他们的学生身份证号码中有2位数的毕业年份,但这证明是不准确的,有时是由于学生被拖延和其他基于身份证号码的异常。

我为我编写了一个powershell脚本,作为一个更大的脚本的一部分,用于获取从powerschool导出的CSV,并根据它们的毕业年份检查它们在活动目录中的位置。脚本中我遇到麻烦的部分如下:

代码语言:javascript
复制
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进行测试时,它就会中断:

代码语言:javascript
复制
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中的相同逻辑测试预期值,它就会工作:

代码语言:javascript
复制
PS C:\> 2022 + 12 + 0 - -2
2036

我搜索了类似的问题,但要么我没有正确地搜索它,要么就没有powershell错误地减去'-2‘的实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-11 19:07:38

注:我不能重现你的具体症状,但以下建议仍然值得注意。

类型约束您的$grade参数以确保它是一个数字。

代码语言:javascript
复制
# 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操作数的类型决定整个操作的数据类型。

下面是一个例子,说明这会产生什么影响:

代码语言:javascript
复制
2 -lt 10    # $true
'2' -lt 10  # !! $false, due to *lexical* comparison
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71443458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档