系统学习 Windows 学习路径:从 CMD 到 PowerShell、系统网络,再到 WSL 与 Server

Select-String

在文本或文件中按正则搜索,输出带文件名和行号的 MatchInfo 对象。

补充说明

Select-String 逐行搜索字符串或文件,默认使用正则表达式且不区分大小写,输出 Microsoft.PowerShell.Commands.MatchInfo 对象,包含 Path、LineNumber、Line、Matches、Context;别名是 sls。-SimpleMatch 关闭正则,-List 每个文件只返回首个匹配,-Quiet 只返回布尔值,-AllMatches 返回一行中的全部匹配,-Context 带前后行。

管道:-InputObject 按值接收字符串行,-Path 可按属性名接收路径;把 Get-ChildItem -Recurse -File 的结果接过来可批量搜文件。权限:读取目标文件需要相应 ACL,无权文件会产生错误。边界:它只做文本搜索,不解析 CSV/JSON 结构;按字段筛选应先解析对象。

版本:5.1 与 7.x 的匹配语义基本一致。7.x 差异:支持 -Raw 直接输出匹配到的字符串;默认编码为 UTF-8,5.1 无 BOM 文件按系统 ANSI 读取,编码不一致会漏匹配。

常用示例

# 1. 在一组日志中搜错误和警告,先取前 20 条
PS C:\> Select-String -Path C:\Logs\*.log -Pattern 'ERROR|WARN' | Select-Object -First 20

# 2. 字面量搜索配置项,避免 . 和 \ 被当成正则
PS C:\> Select-String -Path C:\App\*.config -Pattern 'connectionString' -SimpleMatch -List

# 3. 从管道搜索并显示前后各 2 行上下文
PS C:\> Get-Content C:\Logs\app.log | Select-String -Pattern 'timeout' -Context 2, 2

# 4. 找出不含 Exception 的行,输出对象而不是文本
PS C:\> Select-String -Path C:\Logs\*.log -Pattern 'Exception' -NotMatch | Select-Object Path, LineNumber, Line

# 5. 用 -Quiet 做条件判断,脚本里比解析输出可靠
PS C:\> if (Select-String -Path C:\Logs\app.log -Pattern 'FATAL' -Quiet) { 'found fatal' }

# 6. 提取一行中的全部匹配;默认每行只返回一个 MatchInfo
PS C:\> Select-String -Path C:\Data\*.csv -Pattern '(\d{3})-(\d{4})' -AllMatches | ForEach-Object { $_.Matches.Value }

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. Select-String 的输出能直接和字符串比较吗?应该取哪个属性?
  2. 为什么搜索 config.json 里的 . 可能得到意外结果?
  3. 想递归搜索目录下所有 .log 文件,-Path C:\Logs\*.log 够吗?
答案
  1. 不能,输出是 MatchInfo 对象;取 .Line、.Path、.LineNumber 或 .Matches.Value。
  2. 默认按正则解释,. 匹配任意字符;需要字面量时加 -SimpleMatch 或转义。
  3. 不够,-Path 只匹配当前层;用 Get-ChildItem C:\Logs -Recurse -File -Filter *.log | Select-String ...。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令