簡體   English   中英

在文件名 + 內容上使用正則表達式獲取內容

[英]Get-Content using Regex on the filename + content

我想打印與正則表達式(Get-Content)匹配的文件的輸出,擔心我也在使用正則表達式查找(Get-ChildItem)文件。

-文件示例:ITOPS_Log [2022-06-18].txt

-文件內容:QQQ-9999999-QQQ

#Find the File using Regex: 
$folder = "C:\Users\Eddy\Desktop"

  $valid_files = Get-ChildItem $folder| Where-Object { $_.Name -match 'ITOPS_Log.\[\d{4}-\d{2}-\d{2}\].txt' }
  Write-Output $valid_files

 #Read the file and print content.
     Foreach ($file in $valid_files) {
         $content = (Get-Content $file.FullName)
          ForEach ($line in $content) {
          Write-Output "$line"
         }
     }

輸出:

Mode                 LastWriteTime         Length Name                                                                                                                                                         
----                 -------------         ------ ----                                                                                                                                                         
-a----        22/06/2022     16:11             64 ITOPS_Log [2022-06-18].txt 

Get-Content : An object at the specified path C:\Users\Eddy\Desktop\ITOPS_Log [2022-06-18].txt does not exist, or has been filtered by the -Include or -Exclude parameter.
At C:\Users\Eddy\Desktop\Itops_Log_test_V2.ps1:15 char:25
+             $content = (Get-Content $file.FullName)
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (System.String[]:String[]) [Get-Content], Exception
    + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand

我知道如果只需要數字,我不會使用正則表達式來匹配內容。 但是我已經在沒有過濾器的情況下被卡住了,我需要先解決這個問題,然后應用正則表達式來匹配數字。

如何使用此代碼打印文件的輸出? 我不明白我錯過了什么。

繼續我的評論,Get-ChildItem 和 Get-Content 上的-Path參數嘗試解析通配符,因為您的文件有方括號,它會將其視為一系列字符或數字。

為避免這種情況,請改用-LiteralPath ,這樣路徑中的任何內容都不會被解釋。

然后為了測試文件在方括號內是否有類似日期的內容,我將在文件的 BaseName 屬性上使用錨定正則表達式:

#Find the File using Regex: 
$folder = "C:\Users\Eddy\Desktop"

$valid_files = Get-ChildItem -LiteralPath $folder -Filter 'ITOPS_Log*.txt' -File | 
               Where-Object { $_.BaseName -match '\[\d{4}-\d{2}-\d{2}\]$' }
# show the found files on screen
$valid_files

#Read the file and print content.
foreach ($file in $valid_files) {
    $content = (Get-Content -LiteralPath $file.FullName)
    foreach ($line in $content) {
        Write-Host $line
        # or just the number?
        Write-Host ([regex]'(\d+)').Match($line).Groups[1].Value
    }
}

文件 BaseName 的正則表達式詳細信息(--> 不帶擴展名的文件名):

\[         Match the character “[” literally
\d         Match a single digit 0..9
   {4}     Exactly 4 times
-          Match the character “-” literally
\d         Match a single digit 0..9
   {2}     Exactly 2 times
-          Match the character “-” literally
\d         Match a single digit 0..9
   {2}     Exactly 2 times
\]         Match the character “]” literally
$          Assert position at the end of the string (or before the line break at the end of the string, if any)
#Find the File using Regex: 
$folder = "C:\Users\Eddy\Desktop"

  $valid_files = Get-ChildItem $folder| Where-Object { $_.Name -match 'ITOPS_Log.\[\d{4}-\d{2}-\d{2}\].txt' }
  Write-Output $valid_files

  Write-Output $valid_files

 #Read the file and print content.
     Foreach ($file in $valid_files) {
     
         $content = (Get-Content -LiteralPath $folder\$file)
          ForEach ($line in $content) {
          Write-Output "$line"
         }
     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM