按行读取文本和日志,-Raw 读成单个字符串,-Wait 跟踪追加。
Get-Content 逐行读取文本文件,默认每行输出一个 System.String,因此可以直接接 Select-String、ForEach-Object;加 -Raw 后整份文件作为一个字符串输出,适合交给 ConvertFrom-Json 或正则整体匹配。别名是 gc、cat、type。常用参数还有 -TotalCount(别名 -First)、-Tail、-Wait、-Encoding、-ReadCount。
管道:-Path 可按属性名接收字符串路径,内容以字符串形式流向后续命令。权限:读取文件需要 FILE_READ_DATA,受 ACL 和共享锁影响;用 -Wait 时会保持文件句柄,日志轮转或删除文件可能导致读取中断。
版本与编码:5.1 默认按 BOM 判断编码,无 BOM 时按系统 ANSI 代码页读取;7.x 默认 UTF-8(无 BOM)。5.1 用 -Encoding Byte 读二进制,7.x 改为 -AsByteStream。-Raw 两版都有。
# 1. 跟踪日志末尾,等价于 tail -f;Ctrl+C 退出
PS C:\> Get-Content C:\Logs\app.log -Tail 20 -Wait
# 2. 只读前 50 行并筛出错误,避免把大文件全部载入
PS C:\> Get-Content C:\Logs\app.log -TotalCount 50 | Select-String -Pattern 'ERROR|WARN'
# 3. 读 JSON 必须加 -Raw,否则每一行都单独解析
PS C:\> $cfg = Get-Content C:\App\config.json -Raw | ConvertFrom-Json; $cfg.Port
# 4. 指定编码读取遗留文件,排除乱码来源
PS C:\> Get-Content C:\Data\legacy.txt -Encoding UTF8 -TotalCount 3
# 5. 统计行数;大文件要注意内存占用
PS C:\> (Get-Content C:\Logs\app.log).Count
# 6. 7.x 差异:读取二进制前 4 字节;5.1 用 -Encoding Byte
PS C:\> Get-Content C:\Temp\data.bin -AsByteStream -TotalCount 4
-Raw 时结果是字符串数组,-match 'ERROR' 返回匹配的行而不是布尔值;判断存在性用 Select-String -Quiet,或 (Get-Content -Raw) -match ...。Format-Hex C:\path\file.txt | Select-Object -First 2 看 BOM,再显式 -Encoding。-Wait 不会退出,且会占用文件;日志轮转(重命名/删除)后可能读不到新文件。需要长期跟踪时用 -Tail 0 -Wait 并接受句柄占用。-TotalCount、-Tail 只读部分,逐行管道处理避免 (Get-Content ...) 先构造完整数组。-ReadCount 改变的是向下游批量发送的行数,不会改变最终内容;用它优化吞吐,但不要假设下游每次只收到一行。Get-Content 不解析 CSV/JSON/XML 结构;结构化文件分别用 Import-Csv、ConvertFrom-Json、[xml]。-Encoding Byte 不再可用,改用 -AsByteStream;默认编码变化会让旧脚本写出不同字节。Set-Content — 覆盖写入文本并控制编码。Select-String — 在文件或管道文本中按正则搜索。ConvertFrom-Json — 解析 -Raw 读入的 JSON。Get-ChildItem — 先列出候选文件再批量读取。合上页面,先回答,再展开对照。
Get-Content config.json | ConvertFrom-Json 经常失败,而加 -Raw 就正常?-Wait 跟 -Tail 分别解决什么问题?长期跟踪有什么副作用?-Raw 时每行是独立字符串,ConvertFrom-Json 逐行收到不完整 JSON;-Raw 把整份文件作为一个字符串。-Encoding。-Tail N 只取末尾 N 行;-Wait 持续等待追加。副作用是保持文件句柄、不会自行退出,日志轮转后可能失效。
小程序版
微信扫码,随时查命令