PowerShell Get-Content的PowerShell尾部等效

使用自動化讀取文字檔案中的資料是一種常見情況。大多數編程語言都至少有一種讀取文字檔案的方法,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的文件,其中包含十种不同的水果,以简化操作。在所有示例中,你将使用这个文本文件。
cherry
 berry
 apricot
 papaya
 raspberry
 melon
 peach
 tangerine
 cantaloupe
 orange

不知道你的PowerShell版本是哪个?请访问文章如何检查您的PowerShell版本(所有方法!)

读取文本文件并将结果返回为字符串数组

Get-Content命令从文件中读取内容,并默认情况下,将文本文件的每一行作为一个字符串对象返回。因此,PowerShell对象的集合成为一个字符串对象的数组。

以下代码读取fruits.txt文件的内容,并将结果显示在PowerShell控制台上,如下面的截图所示。

Get-Content .\fruits.txt
Retrieving the text file content using PowerShell Get-Content.

Get-Content将内容读取并存储为一个数组,但你如何确定这一点呢?首先,将内容保存为一个PowerShell对象,然后可以检查该对象以确定其类型。

Save the content into to a object
 $fruits = Get-Content .\fruits.txt
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

查看下面的截圖,$fruits 變數是一個包含十個對象的數組。每個對象代表一行文本。

Confirming that the text file content is stored as an array.

從文本文件返回特定行

在前面的示例中,你已經了解到默認的 Get-Content 結果是一個數組或對象集合。集合中的每個項目對應一個索引號,而 PowerShell 索引通常從零開始。

下面的截圖顯示字符串數組中有十個項目。該數組將十個項目從零到九進行了索引。

Showing that the indexed items in the string array start at zero index.

為了僅顯示第五行的內容,你需要指定索引號 4,並將其放在方括號中(稱為數組表示法)。

(Get-Content .\fruits.txt)[4]

你可能注意到 Get-Content 命令被括號括起來。這種表示法告訴 PowerShell 先運行括號內的命令,然後再執行其他操作。

在下面的截圖中,你將看到唯一返回的結果是 raspberry,它是索引 4 的項目,對應於文本文件中的第五行。

Returning a specific line from Get-Content results.

如果你需要獲取最後一行的內容呢?幸運的是,你不需要知道總行數。相反,使用 [-1] 作為索引,Get-Content 將僅顯示文件的最後一行。

(Get-Content .\fruits.txt)[-1]

限制 Get-Content 返回的頂部結果數量

使用 TotalCount 參數的 Get-Content 來從文本文件中檢索指定數量的行。 TotalCount 參數接受一個表示長整型值的 long ,這意味著一個 最大值為 9,223,372,036,854,775,807

例如,下面的命令讀取內容並將結果限制為三個項目。

Get-Content .\fruits.txt -TotalCount 3

正如您所期望的那樣,下面的結果僅顯示文本文件開頭的前三行。

Reading the top three results using the Get-Content command and the TotalCount parameter.

使用 PowerShell Tail 參數從文件末尾返回結果

在前面的例子中,您使用了 PowerShell Get-Content cmdlet 來讀取文本文件並限制了頂部結果。使用 PowerShell Get-Content 也可以實現相反的效果。使用 PowerShell Tail 參數從文件末尾讀取指定數量的行。

下面的示例代碼讀取文本文件並顯示底部四行的內容。

Get-Content .\fruits.txt -Tail 4

運行 PowerShell tail 命令後,期望的結果將被限制為內容的最後四行,如下圖所示。

Getting the results from the end of a file using the Get-Content Tail parameter.

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

Get-Content -Path .\fruits.txt -Tail 1 -Wait
Using the wait and Tail parameters with Get-Content.

將結果作為單一字符串返回

您可能已經在之前的例子中注意到,您一直在處理字符串數組作為PowerShell Get-Content 輸出。正如您到目前為止所學的,數組的本質允許您一次操作一個項目。

數組通常工作得很好,但可能使替換字符串更加困難。Raw 參數的 Get-Content 讀取文件的整個內容到一個單一字符串對象中。雖然下面的代碼與第一個例子中使用的代碼相同,但Raw 參數將文件內容存儲為單一字符串。

Save the content into to a object
 $fruits = Get-Content .\fruits.txt -Raw
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

下面的截圖展示了將 Raw 參數添加到 Get-Content 會將內容視為單一字符串而不是對象數組。

Confirming that the Raw parameter of Get-Content reads the file content as a single string object.

一旦使用Raw 參數將文件的內容作為單一字符串,您可以用它做什麼呢?也許您需要在該文件的內容中找到並替換一個字符串。在下面的例子中,Get-Content 將文件的內容讀為單一字符串。然後,使用 replace 運算符,將一個特定單詞替換成另一個。

相關: 查找和替換字符串

# 獲取文本文件的原始內容
$fruits = Get-Content .\fruits.txt -Raw
# 顯示內容
$fruits
# 查找並替換單詞 'apricot' 為 'mango'
$fruits -replace 'apricot','mango'
Reading the content of a text file as a single string and replacing a word using the replace operator.

只從符合篩選條件的文件中讀取內容

您是否有一個滿是文件的資料夾,但需要讀取其中幾個文件的內容?使用 PowerShell 的 Get-Content,您不需要在讀取文件內容之前分別篩選文件。 Get-ContentFilter 參數限制了 cmdlet 讀取的文件。

為了演示只讀取特定文件的內容,首先,創建幾個要讀取的文件。如下所示,使用 Add-Content 在您的工作資料夾中創建文件。

# Add-Content 如果文件不存在,會創建 log1.log 和 log2.log 文件,並添加指定的值
Add-Content -Value "This is the content in Log1.log" -Path C:\demo\Log1.log
Add-Content -Value "This is the content in Log2.log" -Path C:\demo\Log2.log
# 確認已創建文件
Get-ChildItem C:\demo
Creating test .log files using Add-Content.

創建了測試文件後,使用 FilterPath 參數來只讀取根目錄中的 .log 文件。在篩選定義中使用的星號表示讓 Get-Content 讀取以 .log 結尾的任何文件。路徑參數的末尾星號限制了只讀取根目錄中的文件。

Get-Content -Path C:\demo* -Filter *.log

如下輸出所示,只顯示了 .log 文件的內容。

Using the 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 -Path .\fruits.txt -Stream *
Listing all available streams in a file using Get-Item.

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

Get-Content -Path .\fruits.txt -Stream ':$DATA'
Explicitly reading the :$DATA stream using Get-Content.

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

# 在fruits.txt文件中添加名為Secret的新ADS
Add-Content -Path .\fruits.txt -Stream Secret -Value 'This is a secret. No one should find this.'
Get-Item -Path .\fruits.txt -Stream *
Adding the Secret alternate data stream using Add-Content and displaying the new stream with Get-Item.

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

Get-Content -Path .\fruits.txt -Stream secret
Using 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/