Powershell替换存储在许多文件夹中的多个文件中的文本

时间:2014-02-04 17:01:37

标签: file powershell replace directory

我想替换多个文件和文件夹中的文本。文件夹名称更改,但文件名始终为config.xml。

$fileName = Get-ChildItem "C:\config\app*\config.xml" -Recurse
(Get-Content $fileName) -replace 'this', 'that' | Set-Content $fileName

当我运行上面的脚本时,它可以正常运行,但它会将整个文本写入config.xml大约20次。怎么了?

4 个答案:

答案 0 :(得分:14)

$ filename是System.IO.FileInfo objects的集合。 您必须循环以获取每个文件的内容: 这应该做你想要的:

$filename | %{
    (gc $_) -replace "THIS","THAT" |Set-Content $_.fullname
}

答案 1 :(得分:6)

$ filename是一个文件名数组,它正在尝试一次完成所有这些操作。尝试一次一个:

$fileNames = Get-ChildItem "C:\config\app*\config.xml" -Recurse |
 select -expand fullname

foreach ($filename in $filenames) 
{
  (  Get-Content $fileName) -replace 'this', 'that' | Set-Content $fileName
}

答案 2 :(得分:3)

通常,您应该使用管道并合并ForEach-Object和/或Where-Object CmdLets。

在你的情况下,这就像是类似于:

Get-ChildItem "C:\config\app*\config.xml" -Recurse | ForEach-Object -Process {
    (Get-Content $_) -Replace 'this', 'that' | Set-Content $_
}

可以稍微缩短一下:

dir "C:\config\app*\config.xml" -recurse |% { (gc $_) -replace 'this', 'that' | (sc $_) }

答案 3 :(得分:0)

我得到了以这种方式替换文本的文件列表。

$ filenames = Get-ChildItem |选择字符串-模式 “” |选择文件名

这将获得12个文件。

要在所有文件中替换此文本

foreach($ filesnames中的$ filename){(Get-Content $ filename.Filename)-替换“”,“” | Set-Content $ filename.Filename}

别忘了文件名的最后一部分。 $ filename.Filename