在有的時候,可能需要對多個文件中的某個字符串進行替換,我們可以通過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 #附件內容到原文件 } } |
