如何基于Read-Host输入从文本文件数组中提取对应行的指定值?
实现根据职位名称匹配对应代码的PowerShell脚本
问题背景
我有一个文本文件JobTitle.txt,内容如下:
Sales Co-Worker, TSALES, TSALSK;Business Navigator, BNOM, BNOMD
希望编写PowerShell代码实现:读取用户输入的职位名称,匹配文件中对应条目后,输出该条目的第二个和第三个值。我自己写了部分代码,但需要完善。
修正后的完整代码
# 读取职位数据库文件(-Raw参数一次性获取全部内容) $jobtitledb = Get-Content C:\Users\Username\Desktop\Scripts\JobTitle.txt -Raw # 将文件内容按中文分号分割为单个职位条目,清理空格并过滤空条目 $jobEntries = $jobtitledb -split ';' | ForEach-Object { $_.Trim() } | Where-Object { $_ } # 获取用户输入的职位名称 $jobtitleinput = Read-Host 'Input the job title' # 初始化变量用于判断是否找到匹配 $foundMatch = $false # 遍历每个职位条目进行匹配 foreach ($entry in $jobEntries) { # 按逗号分割条目,同时清理每个字段的前后空格 $title, $basicCode, $extendedCode = $entry -split ',' | ForEach-Object { $_.Trim() } # 支持不区分大小写的精确匹配,同时加入模糊匹配(输入部分名称也能找到结果) if ($title.Equals($jobtitleinput, [System.StringComparison]::OrdinalIgnoreCase) -or $title -like "*$jobtitleinput*") { Write-Host "Basic code: $basicCode" Write-Host "Extended code: $extendedCode" $foundMatch = $true break # 找到匹配后退出循环,避免重复输出 } } # 如果没有找到匹配项,给出提示 if (-not $foundMatch) { Write-Host "Oops, no matching job title found. Please check your input." }
代码说明
- 文件读取处理:用
-Raw读取整个文件内容,解决了原文件中用中文分号分隔多个职位的问题,确保每个职位条目被正确拆分 - 字段清理:对每个分割后的字段执行
Trim(),避免字段前后的空格干扰匹配逻辑 - 匹配优化:支持不区分大小写的精确匹配,同时加入模糊匹配(输入职位名称的部分内容也能匹配),提升用户使用体验
- 反馈完善:增加了未匹配时的提示信息,让用户清楚知道输入的职位名称不存在
- 效率优化:找到匹配项后立即退出循环,避免不必要的遍历
原代码的问题修正
- 原代码未处理文件中用中文分号分隔职位的情况,导致拆分逻辑错误
- 错误地将用户输入赋值给拆分后的变量,没有实现核心的匹配逻辑
- 未处理字段前后的空格,可能导致匹配失败
- 缺少未匹配时的反馈提示
内容的提问来源于stack exchange,提问作者anyplane
相关产品推荐
相关产品推荐

