如何使用PowerShell递归遍历文件夹替换C/C++文件多行头为单行头
PowerShell实现C/C++文件多行头部替换(保留原换行符)
直接上可运行的脚本,附带关键细节说明:
# 定义旧头部的正则匹配模式(兼容CRLF/LF换行,适配任意$Id内容) $oldHeaderRegex = @" \/\*{80} \/\/_\|[\r\n]+File: \$Id: .* \$[\r\n]+[\r\n]+LEGAL NOTICE: COPYRIGHT Company Inc\., All Rights Reserved [\r\n]+\*{80}\/ \/\/\|_\/ "@ # 定义新的单行头部内容 $newHeader = "// Copyright company name - url" # 递归遍历目标文件并执行替换 Get-ChildItem -Recurse -Include *.h,*.c,*.hpp,*.cpp | ForEach-Object { # 读取完整文件内容,保留原编码和换行符 $content = Get-Content -Path $_.FullName -Raw -Encoding Default # 执行多行替换 $newContent = $content -replace $oldHeaderRegex, $newHeader # 写回文件,避免额外添加换行符 Set-Content -Path $_.FullName -Value $newContent -Encoding Default -NoNewline }
关键细节说明
- 递归文件筛选:
Get-ChildItem -Recurse -Include精准定位所有C/C++源文件和头文件,无需手动遍历子文件夹。 - 保留换行符与编码:
-Raw参数将文件读取为单个字符串,支持多行正则匹配,同时完整保留原文件的换行符结构(解决sed篡改换行符的问题)。-Encoding Default沿用文件原编码,防止乱码;-NoNewline避免写回时额外添加不必要的换行。
- 正则适配性:
- 转义了原头部中的正则特殊字符(如
*、$、/),确保精确匹配。 - 用
[\r\n]+匹配任意换行组合(CRLF/LF),兼容Windows和类Unix系统的文件格式。 - 把
$Id后的固定路径替换为.*,适配不同文件中可能存在的不同版本号或路径。
- 转义了原头部中的正则特殊字符(如
安全测试建议
执行替换前,可在Set-Content后添加-WhatIf参数,预览将被修改的文件列表,确认无误后再移除该参数执行实际替换。
内容的提问来源于stack exchange,提问作者Jimbo
相关产品推荐
相关产品推荐

