windows - Powershell 脚本中的 System.Object [] 显示错误

标签 windows powershell scripting

enter image description here

我目前正在尝试创建一个 powershell 脚本,供学生评估他们的成绩。他们在脚本启动时输入 6 分,然后看到一个选项菜单。我能够毫无问题地满足我的所有要求,但是对于我需要显示输入成绩对应字母的第三部分,我得到了“System.Object[]”显示,而它应该只是成绩字母。我能够获得与 F 对应的成绩,并与 D 对应显示,但是对于任何高于 60 的输入,它们都会向我显示 system.object 显示...我不确定我在语法中搞砸了哪里。非常感谢一些帮助。我提供了显示屏幕截图以及脚本代码:

param (
    [int]$grade1,
    [int]$grade2,
    [int]$grade3,
    [int]$grade4,
    [int]$grade5,
    [int]$grade6
)

# My array of data
[int[]]$grades =($grade1, $grade2, $grade3, $grade4, $grade5, $grade6)

# Menu
do {
Clear-Host
$enteredGrades = "Your Grades: $($grades -join ', ')"
Write-Host "Student Assessment Program:"
Write-Host ""
Write-Host $enteredGrades
Write-Host ""
Write-Host "Menu Options:"
Write-Host "  1. Calculate Average"
Write-Host "  2. Credit Count"
Write-Host "  3. Display Letter Grade"
Write-Host "  4. Exit"
Write-Host ""
$choice = Read-Host "Select a Menu Option"

switch ($choice) {
        1 {
           # Calculate Average
           $average = [math]::Round(($grades | Measure-Object -Average).Average, 9)
           $color = if ($average -ge 60) { 'Green' } else { 'Red' }
           Write-Host "Average: $($average -as [string])" -ForegroundColor $color
           Read-Host "Press Enter to continue..."
           }
        2 {
            # Credit Count
            $credits = ($grades | Where-Object { $_ -ge 50 }).Count
            Write-Host "Credits Earned: $credits"
            Read-Host "Press Enter to continue..."
            }
         3 {
             # Display Letter Grade
            for ($i = 0; $i -lt $grades.Length; $i++) {
            $classNumber = $i + 1
            $letterGrade = switch -wildcard ($grades[$i]) {
            {$_ -ge 80} { 'A' }
            {$_ -ge 70} { 'B' }
            {$_ -ge 60} { 'C' }
            {$_ -ge 50} { 'D' }
            default { 'F' }
        }
        Write-Host ("Class {0}: {1}" -f $classNumber, $letterGrade)
    }
    Read-Host "Press Enter to continue..."
}
         4 {
            # Exit
            Write-Host "Exiting the program."
             }
        default {
            Write-Host "Invalid choice. Please select 1, 2, 3, or 4."
            Read-Host "Press Enter to continue..."
            }
     }
} while ($choice -ne '4')

我尝试了 if/else 方法来解决该问题,但由于某种原因,我在定义变量时遇到错误以及其他错误。我确信语法是正确的,但也许我的逻辑在某个地方有缺陷,因为我仍然是 powershell 的新手。

最佳答案

您的问题来自于 switch 语句的工作方式。与传统的 if/elseif/else 语句不同,即使在 one条件仍会继续> 已满足。这意味着,如果您的成绩为 87,则会检查所有其他条件是否合适:$_ -ge 50/60/70 和 80

这会产生一个对象数组,PowerShell 将通过隐式调用 .ToString() 将其显示为 System.Object[]对于放置在字符串中的每种类型,如果未通过格式化/类型系统另行指定,则返回其基本对象类型。

解决方法或立即修复,只需附加一个继续/中断(感谢mklement0指出中断 也有效) 在每个字母之后让它跳过其余的条件:

$letterGrade = switch ($grades[$i]) {
    {$_ -ge 80} { 'A'; continue }
    {$_ -ge 70} { 'B'; continue }
    {$_ -ge 60} { 'C'; continue }
    {$_ -ge 50} { 'D'; continue }
    default { 'F'}
}

至于如何使用 条件 分支和 if 语句流控制来完成此操作,这里有一个简单示例,您可以将其替换为当前的 switch 语句,前提是您满足其余条件:

$letterGrade = 
    if (($current_grade = $grades[$i]) -ge 80)
    {
        'A'
    }
    elseif ($current_grade -ge 70)
    {
        'B'
    }
    #.... continue with checking $current_grade
    # the else block would be of substitution for the default branch

关于windows - Powershell 脚本中的 System.Object [] 显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77327812/

相关文章:

powershell - Powershell函数以递归方式获取元数据

C# 脚本和安全

git - 如何确定 git 存储库的 "humanish"部分

java - 正则表达式 括号内的括号

c# - 有关 Vault.dll 和 Vaultcli.dll 的信息

windows - 您可以在兼容模式下运行 Windows 批处理文件吗

php - 为什么 docker 在 Windows 10 上不同步容器内的文件?

powershell - 在Powershell中创建通用列表时出现“Could not construct Closed Type using the provided arguments”错误

node.js - Powershell 检测何时添加或删除设备

python - Python 会很好地替代 Windows 命令行/批处理脚本吗?