Windows PowerShell遺忘歷史的人

不管怎樣,Windows PowerShell 都有辦法可以重新呼叫您最近使用的命令,而這可能大有幫助。

唐 · 鐘斯

"那些人忘記歷史,"俗話說"是註定要重複它"。然而,Windows PowerShell 的情況下您需要重複歷史,所以您需要精確地記住它。 Windows PowerShell 自動記住您最近運行的命令,將其保存在緩衝區(或歷史記錄)中,您可以方便地重新調用和運行這些命令。

歷史選項

使用 Windows PowerShell 主控台時,實際上是在處理兩種類型的命令歷史記錄。 這兩種方法彼此完全獨立,毫無關聯。

第一種是您可能非常熟悉的命令列緩衝區。 當您按向上鍵以回檔運行的上一條命令時使用的是這種方法。 您也可以按 F7 以獲取以前運行的命令功能表。 看到功能表之後,使用方向鍵來選擇命令,然後按 Enter,命令就會運行。

預設情況下,命令列緩衝區保存最近的 50 條命令。 您可以通過編輯主控台視窗本身的屬性來增加或減少該設置。 按一下視窗的控制項箱,然後選擇“屬性”。 在“選項”選項卡上,更改“命令歷史記錄緩衝區大小”的大小。

此命令歷史記錄實際上與 Windows PowerShell 本身分離。 它由主控台託管的應用程式維護。 Windows PowerShell 甚至都不知道此歷史記錄的存在。

可供您使用的歷史記錄

Windows PowerShell 自身維護的歷史記錄更為有用。 運行 Get-Command –noun history 可查看處理此擴展歷史記錄日誌的全部四個內置 cmdlet:

  • 添加歷史
  • 清除歷史記錄
  • 獲取歷史
  • 調用歷史

此外,還有內置變數:$ MaximumHistoryCount。 此變數設置 Windows PowerShell 內部命令歷史記錄緩衝區的大小。 預設情況下設置為 64。 如果要更改該值,只需將變數設置為新值。 所做的任何更改僅對當前 shell 會話有效。 如果要進行持久更改,請在設定檔腳本中添加類似以下的內容:

$MaximumHistoryCount = 100

這些內容會添加到名為 [My ]Documents\WindowsPowerShell\profile.ps1 的檔中,這是 shell 搜索並自動執行的四個設定檔腳本之一。

Get-History 是我們將主要瞭解的 cmdlet,因為它也許是這四個中最有用的一個。 它生成 HistoryInfo 類型的物件。 這些物件包含四個有趣的屬性:

  • 命令列:實際運行的命令
  • StartExecutionTime:命令啟動的時間
  • EndExecutionTime:命令結束的時間
  • ExecutionStatus:命令完成之後的狀態;例如,可以為“已完成”或“已停止”

將這些物件與其他 Windows PowerShell 命令結合起來即可實現一些非常奇妙的功能。 例如,假設您打開了一個全新的 shell 視窗並且費力地運行了幾個特定命令來完成複雜的任務。 您是否希望將這些命令轉換為腳本以便按照相同的順序反復執行? 只需運行下列命令:

獲取歷史 |選擇 –Expand 命令列 |Script.ps1 out-File

這裡的技巧體現在 Select-Object 的 –ExpandProperty 參數。 這使得 Select-Object 只輸出指定屬性的內容。 在本例中為 HistoryInfo 物件的 CommandLine 屬性。 這包含了剛剛運行的命令的文本。 然後,您可以在 Windows PowerShell ISE 或其他腳本編輯器中編輯得到的 Script.ps1 檔來調整命令、將硬編碼值轉換為參數、刪除不需要的命令等等。

假如您採用了這種技巧並最終得到以下 Script.ps1 檔:

Import-Module ActiveDirectory
Import-CSV users.csv
Import-CSV users.csv | New-ADUser –path "ou=sales,dc=company,dc=com"

這是一個很短的例子,但通過交互運行這些命令,您可以逐步驗證其運行。 實際上,您可以看到第二條命令只是測試 CSV 檔的導入。 這僅僅用於確保其中包含所需資料。 然後,您可以清除腳本並添加參數:

Param(
  [string]$filename = &(Read-Host "Specify input CSV filename"),
  [string]$path = "cn=Users,dc=company,dc=com"
)
Import-Module ActiveDirectory
Import-CSV $filename | New-ADUser –path $path

“test import”命令和添加的參數收集 CSV 檔案名和目標 OU。 相比使用硬編碼的值,這是一種更好的方法。 請確保無論誰運行此腳本,在使用者忘記指定檔案名時都會提示需要檔案名(這是一種不太好的提示方法,高級函數中將提供更為簡潔一致的方法來進行提示)。 對於第二個參數,請指定一個預設值,當使用者未指定備用值時該值也可以滿足需要。

通過這種方法,可以方便地執行已手動完成一次的流程,並將其快速轉換為可重複的操作序列,已供其他使用者使用。

更多歷史記錄技巧

“獲取”命令列歷史記錄的功能提供了多種絕妙的技巧:

  • 運行 Get-History | Export-CliXMLfilename 可以將命令匯出為 XML 檔。 將 XML 檔發送給同事,同事可以運行 Import-CliXMLfilename | Invoke-History 來快速重複這些命令。
  • 使用 StartExecutionTime 和 EndExecutionTime 屬性來衡量完成命令所用的時間。 例如:獲取歷史 |選擇 commandline,executionstatus,startexecutiontime,endexecutiontime,@{n='ExecutionDuration';e={$_。EndExecutionTime-$_。}} StartExecutionTime
  • 快速找出以前的命令,無需使用向上鍵滾動。 例如,如果知道運行了使用“Select”的命令,請嘗試以下命令進行查找:get-history | where { $_.CommandLine -like '*select*' }

Windows PowerShell 始終將所有內容作為物件而不是大量文本來處理。 這樣,如果在文本日誌檔或同樣繁瑣內容中掃描,會使這種搜索和篩選更為可行。

Don Jones

唐 · 鐘斯 Microsoft MVP 獎得主、"學習 Windows PowerShell 中月的午餐"(曼甯出版有限公司,2010年),旨在説明成為有效的 Windows PowerShell 任何管理員一書的作者。 此外,Jones 還提供公開和現場 Windows PowerShell 培訓。 通過他的 Web 網站聯繫他ConcentratedTech.com

相關內容