主頁 > .NET開發 > for回圈中的多選字串以分隔檔案

for回圈中的多選字串以分隔檔案

2021-12-25 15:34:36 .NET開發

我撰寫了這個腳本來搜索大量文本檔案 (~100,000) 以獲取 4 個不同的搜索條件并匯出到 4 個單獨的檔案,我認為在加載每個檔案時對每個檔案執行所有 4 次搜索比執行 4 次完整搜索更有效像下面的第一次迭代一樣搜索。我可能會遺漏其他一些主要的低效問題,因為我對 powershell 還很陌生。

我將此腳本從第一個版本重新撰寫到第二個版本,但無法弄清楚如何像第一個版本一樣將路徑和資料一起顯示。我正在努力參考回圈中的物件,并將第二個版本拼湊在一起,這是有效的,但沒有給我必要的檔案路徑。

似乎我只是缺少一兩件小事來讓我朝著正確的方向前進。在此先感謝您的幫助

第一個版本:

Get-ChildItem -Filter *.txt -Path "\\file\to\search" -Recurse | Select-String -Pattern "abc123" -Context 0,3 | Out-File -FilePath "\\c:\out.txt"
Get-ChildItem -Filter *.txt -Path "\\file\to\search2" -Recurse | Select-String -Pattern "abc124" -Context 0,3 | Out-File -FilePath "\\c:\out2.txt"
Get-ChildItem -Filter *.txt -Path "\\file\to\search3" -Recurse | Select-String -Pattern "abc125" -Context 0,3 | Out-File -FilePath "\\c:\out3.txt"
Get-ChildItem -Filter *.txt -Path "\\file\to\search4" -Recurse | Select-String -Pattern "abc126" -Context 0,3 | Out-File -FilePath "\\c:\out4.txt"

輸出:

  \\file\that\was\found\example.txt:84:  abc123  
  \\file\that\was\found\example.txt:90:  abc123 
  \\file\that\was\found\example.txt:91:  abc123 
    

第二個版本:

##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Configuration $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

############################################ Global Parameters #############################################
$SearchPath="\\file\to\search"
$ProgressFile=""\\progress\file\ResultsCount.txt"
$records = 105325
##----------------------------------------- End Global Parameters -----------------------------------------

########################################### Search Parameters ##############################################
##Search Pattern 1
$Pattern1="abc123"
$SaveFile1="\\c:\out.txt"

##Search Pattern 2
$Pattern2="abc124"
$SaveFile2="\\c:\out2.txt"

##Search Pattern 3
$Pattern3= "abc125" 
$SaveFile3= "\\c:\out3.txt"

##Search Pattern 4
$Pattern4= "abc126"
$SaveFile4="\\c:\out4.txt"
 
##Search Pattern 5
$Pattern5= ""
$SaveFile5=""

##----------------------------------------- End Search Parameters ------------------------------------------
##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ End of Config $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

############################### SCRIPT #####################################################################
                                                                                                          ## NOTES
                                                                                                          ## ------
##$files=Get-ChildItem -Filter *.txt -Path $SearchPath -Recurse                                             ## Set all files to variable ####  Long running, needs to be a better way #######
##$records=$files.count                                                                                     ## Set record #
Get-ChildItem -Filter *.txt -Path $SearchPath -Recurse | Foreach-Object {                                 ## loop through search folder
$i=$i 1                                                                                                   ## increment record
                                                                                                          ##
Get-Content $_.FullName | Select-String -Pattern $Pattern1 -Context 0,3 | Out-File -FilePath $SaveFile1   ## pattern1 search
Get-Content $_.FullName | Select-String -Pattern $Pattern2 | Out-File -FilePath $SaveFile2                ## pattern2 search
Get-Content $_.FullName | Select-String -Pattern $Pattern3 -Context 0,1 | Out-File -FilePath $SaveFile3   ## pattern3 search
Get-Content $_.FullName | Select-String -Pattern $Pattern4 -Context 0,1 | Out-File -FilePath $SaveFile4   ## pattern4 search
##Get-Content $_.FullName | Select-String -Pattern $Pattern5 -Context 0,1 | Out-File -FilePath $SaveFile5 ## pattern5  search (Comment out unneeded search lines like this one)
$progress ="Record $($i) of $($records)"                                                                  ## set progress
Write-Host "Record $($i) of $($records)"                                                                  ## Writes progress to window
$progress  | Out-File -FilePath $ProgressFile                                                             ## progress file
}                                                                                                         ##
############################################################################################################

輸出:

abc123
abc123
abc123

編輯:此外,我試圖找出一種不必對記錄數量進行硬編碼以獲得不錯的進度讀數的好方法,我注釋掉了我認為可以作業的方式(腳本的第一行和第二行),但是有需要比重新運行相同的搜索兩次更有效,一次用于計數,一次用于 for 回圈。

我對您可以提供的任何運行時效率資訊都非常感興趣。

uj5u.com熱心網友回復:

[編輯 - 感謝 mklement0 指出有關速度和-SimpleMatch開關的錯誤[咧嘴笑]]

Select-Stringcmdlet將接受一個-Path引數...它是FAR [我在想Get-Content,不Get-ChidItem]比使用更快Get-ChildItem的檔案喂S-S[咧嘴笑]

此外,該-Pattern引數接受ORThing|OtherThing|YetAnotherThing- 這樣的正則運算式模式,如果您使用-SimpleMatchswitch 引數,它接受簡單的字串模式

代碼做什么...

  • 定義源目錄
  • 定義檔案規范
  • 將這兩個加入通配符檔案路徑
  • 構建要使用的字串模式陣列
  • Select-String帶有路徑和要搜索的字串陣列的呼叫
  • 使用Group-Object和計算的屬性按.Line來自S-S呼叫屬性的最后部分對匹配項進行分組
  • 將其保存到 $Var
  • 在螢屏上顯示

此時,您可以使用.Nameeach屬性GroupInfo來選擇要發送到每個檔案的專案并構建您的檔案名。

代碼 ...

$SourceDir = 'D:\Temp\zzz - Copy'
$FileSpec = '*.log'
$SD_FileSpec = Join-Path -Path $SourceDir -ChildPath $FileSpec

$TargetPatternList = @(
    'Accordion Cajun Zydeco'
    'better-not-be-there'
    'Piano Rockabilly Rowdy'
    )

$GO_Results = Select-String -Path $SD_FileSpec -SimpleMatch $TargetPatternList |
    Group-Object -Property {$_.Line.Split(':')[-1]}

$GO_Results

輸出 ...

Count Name                      Group                                                                                                                                     
----- ----                      -----                                                                                                                                     
    6 Accordion Cajun Zydeco    {D:\Temp\zzz - Copy\Grouping-List_08-02.log:11:Accordion Cajun Zydeco, D:\Temp\zzz - Copy\Grouping-List_08-09.log:11:Accordion Cajun Zy...
    6 Bawdy Dupe Piano Rocka... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:108:Bawdy Dupe Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:108:Bawdy...
    6 Bawdy Piano Rockabilly... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:138:Bawdy Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:138:Bawdy Pian...
    6 Dupe Piano Rockabilly ... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:948:Dupe Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:948:Dupe Piano ...
    6 Instrumental Piano Roc... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:1563:Instrumental Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:1563:I...
    6 Piano Rockabilly Rowdy    {D:\Temp\zzz - Copy\Grouping-List_08-02.log:1781:Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:1781:Piano Rockabil...

請注意,.Group包含來自S-S呼叫發出的匹配項的行陣列您可以將其發送到您的輸出檔案。

uj5u.com熱心網友回復:

這是我解決這個問題的看法,與Lee_Dailey 的好答案非常相似,但有一個foreach回圈。我建議花一些時間研究 PowerShell 上可用的多執行緒選項,以防您需要提高腳本的性能,您可以專門查看MicrosoftThreadJob模塊,它非常易于使用,或者如果您不能由于某些作業策略安裝模塊,您可以使用Runspace

值得補充的是,您可以使用-Listswitch on Select-String,這樣腳本的性能會得到更多的提高:

-List
每個輸入檔案只回傳匹配文本的第一個實體。這是檢索內容與正則運算式匹配的檔案串列的最有效方法。

$map = @{
    abc123 = 'C:\out_abc123.txt'
    abc124 = 'C:\out_abc124.txt'
    abc125 = 'C:\out_abc125.txt'
}

$pattern = $map.Keys -join '|'

$match = foreach($file in Get-ChildItem *.txt)
{
    Select-String -LiteralPath $file.FullName -Pattern $pattern
}

$match | Group-Object { $_.Matches.Value } | ForEach-Object {
    $_.Group | Select-Object Path, LineNumber, Line | Out-File $map[$_.Name]
}

uj5u.com熱心網友回復:

為了贊美@Santiago SquarzonLee_Dailey的答案,我認為您實際上是在了解Group-Objectcmdlet 非常昂貴,尤其是在記憶體使用方面,因為它阻塞了 PowerShell管道,導致所有搜索結果都堆積在記憶體中。

此外,您的文字搜索字串表明您可能想要做一個Select-String -SimpleMatch ...而不是-Pattern匹配。

繼續您的方法:(
請注意,在示例中,我使用自己的設定來搜索我的腳本檔案)

$ProgressFile = '.\ResultsCount.txt'
$SearchRoot = 'C:\Users\Gebruiker\Scripts'
$Filter = '*.ps1'
$Searches = ConvertFrom-Csv @'
Pattern, File
Null,    .\Null.txt
Test,    .\Test.txt
Object,  .\Object.txt
'@

$Files = Get-ChildItem -Filter $Filter -Path $SearchRoot -Recurse
$Total = $Files.count

$Searches |ForEach-Object { Set-Content -LiteralPath $_.File -Value '' }

$i = 0
$Files |ForEach-Object {
    $Path = $_.FullName
    $Content = Get-Content -LiteralPath $Path
    ForEach ($Search in $Searches) {
        $Content |Select-String $Search.Pattern |
            ForEach-Object { '{0}:{1}:{2}' -f $Path, $_.LineNumber, $_ } |
                Add-Content -LiteralPath $Search.File
    }
    'Record {0} of {1}' -f $i  , $Total |Tee-Object -Append .\ProgressFile.txt
}

說明

  • $Searches = ConvertFrom-Csv @'...
    我建議使用PSObject串列來指定每個搜索(您可以添加列背景關系開始/結束值等)

  • $Searches |ForEach-Object { Set-Content -LiteralPath $_.File -Value '' }
    清空結果檔案(知道它們不是您不能使用的主流的一部分Add-Content

  • $i = 0
    不幸的是,沒有用foreach回圈初始化的自動索引(但是,請參閱:#13772管道索引的自動變數

  • $Content = Get-Content -LiteralPath $Path
    將內容一次加載到記憶體中
    注意1:這是一個字串陣列
    注2:當前項$_$Content每次迭代都會被重用,因此會覆寫前一項并將其從記憶體中卸載

  • $Content |Select-String $Search.Pattern
    使用您定義的模式搜索字串陣列。-SimpleMatch如果您的搜索字串包含特殊字符,您可能會考慮使用該引數。)

  • ForEach-Object { '{0}:{1}:{2}' -f $Path, $_.LineNumber, $_ }
    構建結果輸出字串。
    注意:結果Selext-String確實有一個(隱藏的)LineNumber屬性。

  • Add-Content -LiteralPath $Search.File
    將結果字串添加到特定的輸出檔案。

  • 'Record {0} of {1}' -f $i , $Total |Tee-Object -Append .\ProgressFile.txt
    Tee-Object 將進度寫入標準輸出(顯示)和特定檔案。

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/392525.html

標籤:电源外壳 powershell-2.0 powershell-3.0 powershell-4.0

上一篇:Powershell:在此物件(WIN10-18363)上找不到屬性“WorkingDirectory”但存在

下一篇:通過Powershell對AD物件的屬性進行排序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more