撰寫 PowerShell 指令稿自動將文字檔案中指定的文字內容,以新的文字內容取代。
如果我們想要將一個文字檔案中的某些文字替換成新的文字,只要用普通的文字編輯器,配合搜尋與取代功能即可輕鬆完成,但是假設我們想要處理的檔案數量很多的時候(例如數十個或上百個檔案),就很難靠手動的方式來完成。
PowerShell 有許多的 cmdlets 可以使用,只要將適當的 cmdlets 組合起來,就可以輕鬆解決這種大量檔案的文字取代問題,以下我們將逐步解說指令稿的撰寫步驟。
Step 1
為了示範方便,我們先建立一個文字檔案,其內容如下:
PowerShell is a task automation and configuration management framework from Microsoft. PowerShell commands follow a Verb-Noun semantic with a set of parameters. It's easy to learn and use PowerShell.
而我們將這個文字檔案儲存在 D:OfficeGuidedemo.txt
。
Step 2
在取代檔案中的文字之前,必須先使用 Get-Content
這個指令先把檔案內容讀取出來:
# 讀取檔案內容 Get-Content -path D:OfficeGuidedemo.txt
Step 3
由於在預設的情況下,Get-Content
會以換行字元作為分隔符號,將檔案內容切成一行一個元素的字串陣列,而若要進行文字取代工作的話,可加上 -Raw
參數,讓它保留檔案中的換行字元,直接將所有文字內容轉為一個字串:
# 以單一字串傳回檔案內容 Get-Content -path D:OfficeGuidedemo.txt -Raw
Step 4
使用 PowerShell 的取代運算子(-replace
),將舊字串以新字串取代。假設我們想要將 PowerShell
取代為 SuperShell
,就可以這樣寫:
# 取代文字 (Get-Content -path D:OfficeGuidedemo.txt -Raw) -replace 'PowerShell','SuperShell'
Step 5
將取代完成的文字內容,使用 Set-Content
儲存至檔案中:
# 將取代完成的文字儲存至檔案 ((Get-Content -path D:OfficeGuidedemo.txt -Raw) -replace 'PowerShell','SuperShell') | Set-Content -Path D:OfficeGuidedemo_replace.txt # 查看取代完成的檔案內容 Get-Content -path D:OfficeGuidedemo_replace.txt
這裡我們將處理完成的結果儲存至 demo_replace.txt
這個新檔案中,如果想要覆蓋原來的檔案,就指定為原來的檔案名稱即可。
完成單一檔案的文字取代之後,接下來就可以結合迴圈,處理大量的文字檔了。
Step 1
使用 Get-ChildItem
配合 Foreach-Object
來處理大量檔案,先嘗試將所有的檔案內容讀取出來,測試一下迴圈結構:
# 讀取指定目錄所有的檔案內容 Get-ChildItem D:OfficeGuide*.txt | Foreach-Object { Get-Content $_ }
這段程式碼會將 D:OfficeGuide
目錄下所有的文字檔案(*.txt
)逐一放入迴圈當中,交給 Get-Content
讀取檔案內容。
Step 2
確認迴圈可以正常執行之後,將取代文字的程式碼加入迴圈之中:
# 取代所有文字檔中的文字 Get-ChildItem D:OfficeGuide*.txt | Foreach-Object { ((Get-Content -path $_ -Raw) -replace 'PowerShell','SuperShell') | Set-Content -Path ($_ -replace '.txt$','_replace.txt') }
這裡我們將原始檔案名稱自動加上 _replace
,做為新的檔案名稱,也就是將完整檔案名稱結尾的 .txt
以 _replace.txt
來取代,這樣就可以一次處理大量檔案的文字取代工作了。
參考資料:MCP Mag