我目前正在尝试创建一个 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/