2017年10月5日

PowerShell 中的 $_ 是什麼呢?

在 PowerShell 裡,$ 是用來宣告變數的啟始字元,因此只要看到 $ 帶頭的,就知道它會儲存變數的內容。那麼 $_ (錢字號尾隨底線)又代表什麼呢?它代表目前的管線物件 (Pipeline Object),這樣的說明很抽象,讓我們用實例來瞭解該怎麼用 $_。
要把文字檔裡面特定的文字換成其他文字,就可用 $_。例如,要將 2016 換成 2017,也就是將下面的內容:
2016 年 4 月 13 日
2016 年 8 月 22 日
2017 年 1 月 3 日
2017 年 3 月 31 日

變成:
2017 年 4 月 13 日
2017 年 8 月 22 日
2017 年 1 月 3 日
2017 年 3 月 31 日

使用下面的指令即可,為了便於比較結果,刻意讓來源的文字檔名與目的檔名不一樣:
(Get-Content D:\Tmp\t1.txt -Encoding UTF8) | 
Foreach-Object {$_ -replace "2016", "2017"} | 
Set-Content D:\Tmp\t2.txt

透過 Get-Content 取得 D:\Tmp\t1.txt 的內容,並將它儲存於陣列變數中,如此一來,每個項目就是每一行的內容。請特別注意,為了確保在完全取得文字檔內容之前,PowerShell 不會做其他事情,所以要用一組刮號()把 Get-Content 包起來。

接著使用 ForEach-Object 將 Get-Content 讀取到的陣列,逐行檢查,並呼叫 replace 方法來將內含 2016 的文字換成 2017,也就是 $_ -replace 這段指令碼所做的事情。

最後透過 Set-Content 把結果寫入 D:\Tmp\t2.txt。

提醒大家,如果遇到要取代的字元是 PowerShell 的保留字元時,要先加上逸出字元 \,然後尾才是保留字元,比方說,要將 * 號換成 %,就要寫成:
"\*", "%"

PowerShell 的保留字元如下所列:
  • $
  • (
  • )
  • *
  • +
  • .
  • [
  • ]
  • ?
  • \
  • /
  • ^
  • {
  • }
  • |
接下來,再舉個例子,要找出 C:\Windows 目錄中,所有副檔名為 .log 的檔案,一樣使用 $_ 執行篩選的工作:
$Path="C:\Windows"
Get-ChildItem $Path | Where {$_.Extension -eq ".log"}

下圖是在 PowerShell ISE 撰寫程式碼時,所出現的語法提示,很清楚地看到,於輸入完 . 之後,列出所有支援的屬性。
PowerShell ISE 列出所有支援的屬性

沒有留言:

張貼留言