文件内容批量化替换

梔锿-iyutong-雨桐 Lv2

一、介绍

最近在开发嵌入式操作系统,因为UI部分使用可视化工具制作的,所以需要编译UI为C语言并放到项目文件中,又因为可视化工具直接导出的C语言文件引入库的部分与我项目不一样,每次导出后想编译都需要手动修改,非常麻烦,并且浪费时间,所以学了一下Windows系统的脚本语言 PowerShell 写了个批处理程序来实现自动化批量修改。

PowerShell 是微软在 Windows10 开始引入的全新脚本,后缀文件为.ps1,只能在Windows10之后的系统中运行。

二、代码开发

1.获取所有指定扩展名的文件并递归搜索子文件夹

这里我们使用 Get-ChildItem 命令获取指定路径下的文件和文件夹。

-Path:指定要获取子项的路径。默认为当前路径。
-Recurse:递归地获取指定路径下的所有子项。
-Include:只获取具有指定名称模式的文件或文件夹。
-Exclude:排除具有指定名称模式的文件或文件夹。
-Filter:使用 Windows Shell 表达式来筛选文件和文件夹。
-Name:仅返回文件和文件夹的名称,而不是完整路径。
-Force:强制获取文件和文件夹,即使它们被隐藏或系统文件也是如此。

然后使用 ForEach-Object 命令对每个输入的对象执行指定的操作。

-InputObject:指定要处理的对象。通常通过管道传递。
-Begin:在处理任何对象之前执行的脚本块。
-Process:对每个输入对象执行的脚本块。
-End:在处理所有对象之后执行的脚本块。
-Remaining:在管道关闭后,对剩余的对象执行的脚本块。
-ThrottleLimit:限制并发操作的数量。

事例:

1
2
3
4
Get-ChildItem -Path "文件夹路径" -Recurse -Include "文件后缀" | ForEach-Object {
# 需要批处理的脚本
# 可通过 $_ 变量来获取当前管道中的对象
}

2.使用指定的编码读取文件的全部内容

这里我们使用 Get-Content 命令读取上一步中获取到的文件内容。

-Path:指定要读取内容的文件的路径。可以使用通配符来选择多个文件。
-ReadCount:指定每次读取的行数。默认值为 1,表示一次读取一行。
-TotalCount:指定要读取的总行数。可以是一个数字或 All,表示读取所有行。
-Tail:指定要读取的最后几行。例如,-Tail 10 表示读取最后 10 行。
-Wait:持续监视文件,并在有新内容时读取。适用于日志文件等场景。
-Delimiter:指定行分隔符。默认为换行符。
-Encoding:指定文件的编码格式。例如,UTF8、ASCII 等。
-Raw:以原始格式读取文件内容,不进行任何处理。
-NoNewline:在输出内容时不添加换行符。

事例:

1
2
# 把读取到的内容复值给变量 content
$content = Get-Content $_.FullName -Raw -Encoding UTF8

3.遍历所以替换规则并进行替换

因为往往我们需要替换好几组数据所以我们先创建一个哈希表然后在用 foreach 循环遍历哈希表

事例:

1
2
3
4
5
6
7
8
9
# 创建哈希表,并复值给变量 replacements
$replacements = @{
'原来的文字1' = '替换后的文字1'
'原来的文字2' = '替换后的文字2'
}

foreach ($key in $replacements.Keys) {
# 需要处理的操作代码
}

然后使用 -replace 运算符,对字符串进行查找和替换操作

事例:

1
$content = $content -replace $key, $replacements[$key]

4.将替换后的内容使用指定的编码写回文件

这里我们使用 Set-Content 命令把文本保存到文件中去。

-Path:指定要写入内容的文件的路径。可以使用通配符来选择多个文件。
-Value:指定要写入文件的内容。可以是字符串、数组或其他对象。
-Force:强制写入文件,即使文件已存在或只读。
-Append:将内容追加到文件末尾,而不是覆盖现有内容。
-Encoding:指定文件的编码格式。例如,UTF8、ASCII 等。
-PassThru:将输出发送到管道,而不是写入文件。

事例:

1
Set-Content -Path $_.FullName -Value $content -Encoding UTF8

三、完整代码

废话不多说直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#iyutong.cn
# 定义要修改的文件夹路径
$folder = "D:\Project\CLion\esp32s3\src\ui"
# 定义要替换的多组文字
$replacements = @{
'#include "custom.h"' = '#include "../custom/custom.h"'
'#include "lvgl/lvgl.h"' = '#include "lvgl.h"'
'#include "lv_font.h"' = '#include "lvgl.h"'
'#include "gui_guider.h"' = '#include "../generated/gui_guider.h"'
}
# 定义要修改的文件扩展名
$fileExtensions = @(".h", ".c")
# 定义文件编码
$encoding = "UTF8"
Get-ChildItem -Path $folder -Recurse -Include $fileExtensions | ForEach-Object {
$content = Get-Content $_.FullName -Raw -Encoding $encoding
foreach ($key in $replacements.Keys) {
$content = $content -replace $key, $replacements[$key]
}
Set-Content -Path $_.FullName -Value $content -Encoding $encoding
}
Write-Host "批量化替换成功!"
Read-Host -Prompt "按回车建退出..."

定义要替换的多组文字时,建议把需要修改文字的前后内容都添加进去,就行我代码中一样,防止在代码发生重复运行时出现重复添加文字的情况发生。

四、运行脚本

新建一个 .txt 文本文件

新建
新建

重命名,并修改后缀名为 .ps1
重命名
重命名

用记事本打开文件
打开
打开

步骤三中的代码复制到文件中,并保存文件(快捷键 Ctrl+S
保存
保存

右键文件选择 使用 PowerShell 运行
运行
运行

运行
运行

五、补充

如果运行代码中文乱码,请另存文件并修改编码为 ANSI

乱码
乱码

乱码
乱码

  • 标题: 文件内容批量化替换
  • 作者: 梔锿-iyutong-雨桐
  • 创建于 : 2025-01-22 21:58:18
  • 更新于 : 2025-03-02 14:43:01
  • 链接: https://www.iyutong.cn/posts/fca88aae/
  • 版权声明: 版权所有 © 梔锿-iyutong-雨桐,禁止转载。
评论