使用PowerShell提取证书链指定行时出现内容换行异常问题
解决PowerShell提取证书链行时内容折行的问题
问题原因
你遇到的"G2"被拆分到新行的情况,本质是原证书文件里的长逻辑行被折成了物理多行(比如证书主题/颁发者字段太长,生成文件时自动折行)。而Get-Content默认按物理换行符拆分每行,Select-String只会匹配包含s:/i:/v:的物理行,导致后续折行的内容(比如"G2")被当成单独的无匹配行,最终被错误拆分。
解决方案
方法1:一次性读取文件并匹配完整逻辑行
使用-Raw参数将整个文件读取为单个字符串,再用正则匹配从s:/i:/v:开始到下一个目标行前的所有内容,确保完整捕获逻辑行:
Get-Content "input.txt" -Raw | Select-String -Pattern '(s:.*?|i:.*?|v:.*?)(?=\r?\n(?:s:|i:|v:|$))' -AllMatches | ForEach-Object { $_.Matches.Value } | Out-File "output.txt"
-Raw:避免按物理行拆分文件,保留完整的文本结构- 正则表达式:非贪婪匹配
s:/i:/v:开头的内容,直到遇到下一个目标行开头或文件结尾,确保捕获完整的逻辑行
方法2:遍历合并折行内容
逐行读取文件,将连续的非目标行(不以s:/i:/v:开头)合并到上一行,再提取目标行:
$lines = Get-Content "input.txt" $outputLines = @() $currentEntry = $null foreach ($line in $lines) { if ($line -match '^(s:|i:|v:)') { # 遇到新的目标行,先把之前累积的内容加入输出 if ($currentEntry) { $outputLines += $currentEntry } $currentEntry = $line.Trim() } else { # 非目标行,追加到当前累积的内容后 if ($currentEntry) { $currentEntry += $line.Trim() } } } # 加入最后一行累积的内容 if ($currentEntry) { $outputLines += $currentEntry } $outputLines | Out-File "output.txt"
这种方法更直观,适合需要手动控制行合并逻辑的场景。
排查验证
可以先执行以下命令查看"G2"所在行的上下文,确认折行情况:
Get-Content "input.txt" | Select-String -Pattern 'G2' -Context 1,1
该命令会显示包含"G2"的行及其前后各1行,帮助确认是否是折行导致的问题。
内容的提问来源于stack exchange,提问作者Pratyush
相关产品推荐
相关产品推荐

