在有的时候,可能需要对多个文件中的某个字符串进行替换,我们可以通过PowerShell对文件遍历并替换其字符串。
例:在E:\test目录下存在有多个子目录,我们需要将该目录下xml格式文件中的字符串“nihao”替换为“Hello”,分为以下两个步骤:
1、遍历该目录下的所有*.xml文件
2、对查找出的*.xml文件中的字符串进行替换
使用Get-ChildItem命令可以对文件或目录进行遍历,–Rescure参数遍历子目录,-Include 参数过滤文件类型,如下:
Get-Childitem E:\test -Recurse -Include *.xml
获取到所需要遍历的文件之后,接下来使用Get-Content命令获取文件中的具体内容,由于上一步输出有多个文件,在此使用Foreach语句对每个文件进行操作,读取每个文件中的内容,命令如下:
$files = Get-Childitem E:\test -Recurse -Include *.xml foreach ($file in $files) { $content = get-content $file.pspath $content } |
Get-Content在读取文件内容的时候,会以“行”为单位,将其放入到一个数组中,所以在替换的时候,还需要使用 Foreach语句对每行进行处理,使用 Replace方法进行替换,命令如下:
foreach ($line in $content) { $liner = $line.Replace("nihao","Hello") } |
在此处需要注意的是,替换完成后,实际上替换后的内容还并没有被真正写入到原文件中,还需要使用Set-Content命令将替换后的内容写入到原文件中,命令如下:
foreach ($line in $content) { $liner = $line.Replace("nihao","Hello") Set-Content $file.pspath -Value $liner } |
此时仍然会出现一个新的问题,就是每个文件被更新后,只是保留了最后一行的内容,所以在这里不应该使用Set-Content命令,而是应该使用Add-Content命令,将修改后的内容追加到原文件中,但这样一来,新内容和旧内容都会存在于同一个文件中,所以在追加新内容之前,需要先将原文件内容清空,可以使用Clear-Content命令。
完整的脚本命令如下:
copy-item E:\test F:\ -force -recurse #在替换之前先对文件进行备份 $files = Get-Childitem E:\test -Recurse -Include *.xml foreach ($file in $files) #遍历文件 { $content = get-content $file.pspath clear-content $file.pspath #清空每个文件内容 foreach ($line in $content) #对每个文件中的行进行遍历 { $liner = $line.Replace("nihao","Hello") Add-content $file.pspath -Value $liner #附件内容到原文件 } } |