使用自動化讀取文字檔案中的資料是一種常見情況。大多數編程語言都至少有一種讀取文字檔案的方法,PowerShell也不例外。PowerShell的Get-Content cmdlet,即PowerShell的tail等效工具,讀取文字檔案的內容並將資料匯入PowerShell工作階段。
當您需要將文字檔案用作腳本的輸入時,PowerShell的Get-Content cmdlet是一個不可或缺的工具。也許您的PowerShell腳本需要讀取計算機清單以進行監視,或者匯入電子郵件範本以發送給用戶。PowerShell的Get-Content很容易支援這些情況!
如何實時跟蹤日誌檔案?是的,PowerShell的Get-Content也可以做到!繼續閱讀本文,您將學會如何使用Get-Content cmdlet在PowerShell中讀取文字檔案。
先決條件
如果您有興趣跟著本教程中的例子操作,您需要滿足以下要求。
- 您需要一台運行Windows 10的電腦。本教程使用的是Windows 10 20H2版本。但不用擔心,您擁有的Windows 10版本也可以。
- 您的電腦上應該安裝了至少Windows PowerShell 5.1,或者PowerShell 7.1。本教程使用的是PowerShell 7.1,但任何一個版本都可以!
- 你需要一个代码编辑器来编写和测试命令。推荐使用的编辑器是Windows PowerShell ISE,它是Windows内置的,以及Visual Studio Code (VSCode)。本文将使用VSCode。
- 如果在计算机上创建一个工作目录也会有所帮助。工作文件夹可以放在任何位置。但是,你会注意到本教程中的示例文件都放在C:\demo文件夹中。
- 首先,你需要一些内容!在你的工作目录中创建一个名为fruits.txt的文件,其中包含十种不同的水果,以简化操作。在所有示例中,你将使用这个文本文件。
不知道你的PowerShell版本是哪个?请访问文章如何检查您的PowerShell版本(所有方法!)。
读取文本文件并将结果返回为字符串数组
Get-Content
命令从文件中读取内容,并默认情况下,将文本文件的每一行作为一个字符串对象返回。因此,PowerShell对象的集合成为一个字符串对象的数组。
以下代码读取fruits.txt文件的内容,并将结果显示在PowerShell控制台上,如下面的截图所示。

Get-Content
.Get-Content
将内容读取并存储为一个数组,但你如何确定这一点呢?首先,将内容保存为一个PowerShell对象,然后可以检查该对象以确定其类型。
查看下面的截圖,$fruits
變數是一個包含十個對象的數組。每個對象代表一行文本。

從文本文件返回特定行
在前面的示例中,你已經了解到默認的 Get-Content
結果是一個數組或對象集合。集合中的每個項目對應一個索引號,而 PowerShell 索引通常從零開始。
下面的截圖顯示字符串數組中有十個項目。該數組將十個項目從零到九進行了索引。

為了僅顯示第五行的內容,你需要指定索引號 4
,並將其放在方括號中(稱為數組表示法)。
你可能注意到
Get-Content
命令被括號括起來。這種表示法告訴 PowerShell 先運行括號內的命令,然後再執行其他操作。
在下面的截圖中,你將看到唯一返回的結果是 raspberry
,它是索引 4
的項目,對應於文本文件中的第五行。

Get-Content
results.如果你需要獲取最後一行的內容呢?幸運的是,你不需要知道總行數。相反,使用 [-1]
作為索引,Get-Content
將僅顯示文件的最後一行。
限制 Get-Content
返回的頂部結果數量
使用 TotalCount
參數的 Get-Content
來從文本文件中檢索指定數量的行。 TotalCount
參數接受一個表示長整型值的 long ,這意味著一個 最大值為 9,223,372,036,854,775,807。
例如,下面的命令讀取內容並將結果限制為三個項目。
正如您所期望的那樣,下面的結果僅顯示文本文件開頭的前三行。

Get-Content
command and the TotalCount
parameter.使用 PowerShell Tail 參數從文件末尾返回結果
在前面的例子中,您使用了 PowerShell Get-Content
cmdlet 來讀取文本文件並限制了頂部結果。使用 PowerShell Get-Content
也可以實現相反的效果。使用 PowerShell Tail
參數從文件末尾讀取指定數量的行。
下面的示例代碼讀取文本文件並顯示底部四行的內容。
運行 PowerShell tail
命令後,期望的結果將被限制為內容的最後四行,如下圖所示。

Get-Content
Tail
parameter.Tail
參數通常與 Wait
參數一起使用。使用 Wait
參數保持文件打開並每秒檢查新內容。下面的演示展示了 Tail
和 Wait
參數的作用。要退出 Wait
,請使用 CTRL+C
鍵組合。

wait
and Tail
parameters with Get-Content
.將結果作為單一字符串返回
您可能已經在之前的例子中注意到,您一直在處理字符串數組作為PowerShell Get-Content
輸出。正如您到目前為止所學的,數組的本質允許您一次操作一個項目。
數組通常工作得很好,但可能使替換字符串更加困難。Raw
參數的 Get-Content
讀取文件的整個內容到一個單一字符串對象中。雖然下面的代碼與第一個例子中使用的代碼相同,但Raw
參數將文件內容存儲為單一字符串。
下面的截圖展示了將 Raw
參數添加到 Get-Content
會將內容視為單一字符串而不是對象數組。

Raw
parameter of Get-Content
reads the file content as a single string object.一旦使用Raw
參數將文件的內容作為單一字符串,您可以用它做什麼呢?也許您需要在該文件的內容中找到並替換一個字符串。在下面的例子中,Get-Content
將文件的內容讀為單一字符串。然後,使用 replace
運算符,將一個特定單詞替換成另一個。
相關: 查找和替換字符串

replace
operator.只從符合篩選條件的文件中讀取內容
您是否有一個滿是文件的資料夾,但需要讀取其中幾個文件的內容?使用 PowerShell 的 Get-Content
,您不需要在讀取文件內容之前分別篩選文件。 Get-Content
的 Filter
參數限制了 cmdlet 讀取的文件。
為了演示只讀取特定文件的內容,首先,創建幾個要讀取的文件。如下所示,使用 Add-Content
在您的工作資料夾中創建文件。

.log
files using Add-Content
.創建了測試文件後,使用 Filter
和 Path
參數來只讀取根目錄中的 .log
文件。在篩選定義中使用的星號表示讓 Get-Content
讀取以 .log
結尾的任何文件。路徑參數的末尾星號限制了只讀取根目錄中的文件。
如下輸出所示,只顯示了 .log
文件的內容。

Filter
parameter with PowerShell Get-Content
to limit the read files.相關: Get-ChildItem: 作為一個整體列出文件、註冊表、憑證等
讀取檔案的替代資料流
到目前為止,您一直只使用文字檔案,但是Get-Content
可以讀取檔案的替代資料流(ADS)。請隨意閱讀更多有關資料流的資訊,但您可以將資料流視為與典型檔案內容一起存儲的另一個資料屬性。
替代資料流是Windows NTFS檔案系統的一個功能,因此在非Windows作業系統上使用
Get-Content
時不適用。
您可以通過使用Stream
參數運行Get-Item
來查看替代資料流。在使用Stream
參數引用檔案時,Get-Item
會返回一個名為Stream
的屬性,如下所示。此默認檔案內容流用:$DATA
表示。
為了展示默認的:$DATA
資料流,使用Get-Item
cmdlet顯示檔案fruits.txt中的所有可用資料流。如下所示,Get-Item
顯示了一個資料流。

Get-Item
.Get-Content
的Stream
參數明確讀取默認的:$DATA
資料流的內容,如下所示。返回的內容與默認的Get-Content
輸出相同,因為默認情況下會讀取:$DATA
資料流。

:$DATA
stream using Get-Content
.為了演示使用Get-Content
擷取替代資料流,請修改一個檔案使用Add-Content
來添加新的資料流。使用Get-Item
顯示新的資料流以及預設的:$DATA
資料流,如下例所示。

因為預設只讀取:$DATA
資料流,所以使用Get-Content
的Stream
參數來擷取新的Secret
資料流內容。如下所示,顯示Secret
資料流內容而不是預設的檔案內容。

Get-Content
to read the Secret
alternate data stream content.使用 PowerShell 的下一步驟Get-Content
在本文中,您已經學會了許多使用Get-Content
來讀取和操作內容的方法。您甚至已經學會了Get-Content
足夠靈活,可以從替代資料流中讀取內容!
根據您在本文中所學,您還可以以什麼其他方式使用Get-Content
在您的工作中?也許您可以使用Get-Content
來確定備份檔案是否過時,並觸發自動調用以運行備份作業?
Source:
https://adamtheautomator.com/powershell-get-content/