PowerShell脚本中foreach客户列表显示位置异常问题排查
问题解决:PowerShell实时匹配客户列表显示顺序异常
问题原因
当前脚本输出逻辑顺序颠倒,且未在每次循环时清除旧输出,导致匹配列表显示在输入提示之前:
- 脚本先绘制输入提示,再读取用户输入,最后输出匹配列表,下一次循环会在列表下方重复绘制提示,视觉上造成列表在提示上方的错觉。
- 未初始化
$fullstring变量,首次运行时会出现空值输出问题。 [System.Console]::ReadKey的光标位置未与Write-Host输出正确同步。
修复后的脚本
# 初始化变量 $fullstring = "" $customersJson = Get-Content "%jsonpath%\customers.json" | ConvertFrom-Json | ForEach-Object { $_.name } while ($true) { # 每次循环清屏,确保内容从顶部开始绘制 Clear-Host [console]::CursorVisible = $false # 绘制输入提示区域 Write-Host "Type the customer name:" -ForegroundColor Yellow Write-Host "> " -NoNewline Write-Host $fullstring -ForegroundColor Cyan # 读取用户输入 $userInput = [System.Console]::ReadKey($true) # 处理输入逻辑 if( $userInput.Key -eq [System.ConsoleKey]::Backspace ) { $fullstring = $fullString -replace ".$" } elseif( $userInput.Key -eq [System.ConsoleKey]::Enter ) { break } else { $fullstring = $fullString + $userInput.KeyChar } # 匹配并显示客户列表 if($fullstring.Length -ge 1) { # 转义用户输入,避免特殊字符干扰正则匹配 $customersList = $customersJson | Where-Object { $_ -match [regex]::Escape($fullstring) } Write-Host "`n____________________________`n" -ForegroundColor DarkGray foreach($customer in $customersList) { # 优雅实现首字母大写格式 $formattedCustomer = (Get-Culture).TextInfo.ToTitleCase($customer.ToLower()) if ($formattedCustomer -eq $fullstring) { Write-Host $formattedCustomer -ForegroundColor DarkRed } else { Write-Host $formattedCustomer -ForegroundColor DarkGray } } Write-Host "____________________________" -ForegroundColor DarkGray } } [console]::CursorVisible = $true Write-Host "`nTyped customer: $fullString" -ForegroundColor Red
关键修复点
- 开启清屏:启用
Clear-Host,每次循环从控制台顶部重新绘制内容,彻底避免旧输出干扰显示顺序。 - 变量初始化:添加
$fullstring = "",解决首次运行时的空值输出错误。 - 规范输入判断:使用
[System.ConsoleKey]枚举值判断按键,避免字符串匹配的潜在问题。 - 正则转义处理:用
[regex]::Escape()处理用户输入,防止特殊字符导致正则匹配异常。 - 优化大小写转换:使用
(Get-Culture).TextInfo.ToTitleCase()替代手动字符替换,实现更通用的首字母大写格式。
内容的提问来源于stack exchange,提问作者Jânio Gentil
相关产品推荐
相关产品推荐

