目前是4.0版本。我很容易找到包含一個字串的檔案。試圖用不同行中的兩個字串做一些稍微復雜的事情,但沒有成功。這個問題顯然是由于單獨評估行的方式,以及結果作為物件在命令之間的管道,使得明顯的解決方案不起作用。
# Works, so simple
Get-ChildItem| Select-String-Pattern "Test1" -List | Select Path
#失敗
Get-ChildItem | Select-String -Pattern "Test1. Test2" -List | Select Path
#失敗
Get-ChildItem | Select-String -Pattern "Test1" - List | Select-String - Pattern "Test2" -List | Select Path
從概念上講,這很簡單,但我一直在為尋找一個解決方案而絞盡腦汁。在較新的版本中可能會更容易,但在涉及到的服務器上無法更新。我可以在Python中撰寫一個腳本來獲得解決方案,但在這一點上,我想讓PowerShell來做這件事,因為我不甘心。
知道每個命令會回傳什么,如何獲得底層物件資料,然后如何將這些資料輸送到后續的命令中,等等,對我來說,PowerShell一直是個問題:(
)uj5u.com熱心網友回復:
下面的命令使用Where-Object來測驗我們的條件
Get-ChildItem | Where-Object {
($_ | Select-String -Pattern 'test1' -Quiet) -and
($_ | Select-String -Pattern 'test2' -Quiet)
這一行檢查從Get-ChildItem(由$_代表)輸送過來的檔案是否與'test1'和'test2'都匹配。 使用-Quiet引數將使Select-String在找到匹配的情況下回傳true,如果沒有則回傳false。
Get-ChildItem -File | Where-Object {
($_ | Select-String -Pattern 'test1', 'test2' !
Group-Object -Property 'Pattern' ).Count -eq 2 。
通過這一行,我給了Select-String兩個模式來尋找。 這不會確保兩個模式都被匹配,而是會回傳每個模式的匹配結果。 在Select-String回傳的[Microsoft.PowerShell.Commands.MatchInfo]物件上有一個叫做Pattern的屬性。 如果我使用 Group-Object 將我得到的所有 MatchInfo 結果按屬性 "Pattern "分組,然后我可以檢查我是否最終有 2 個組物件,每個組物件都有我的模式。 如果是的話,該物件將由Where-Object
就像Python或其他語言一樣,你需要發現和學習一些命令/方法和引數,這將使你的生活更輕松,通常有不止一種方法來做某事。
利用PowerShell提供的內置幫助來了解命令和這些命令所產生的物件。 Get-Command、Get-Help、Get-Member可以說是3個最有用的cmdlet,特別是對剛接觸PowerShell或在PowerShell中掙扎的人來說
uj5u.com熱心網友回復:
正如Olaf所指出的,Select-String的-Pattern引數接受一個array的模式。
這樣的命令回傳符合任何給定模式的行。
如果你想確定一個給定的檔案是否匹配所有給定的模式(至少一次),需要更多的作業:
$patterns = 'Test1'/span>, 'Test2'/span>
Get-ChildItem -檔案 |
Select-String -Pattern $patterns !
Group-Object -Property Path|
凡是物件 {
($_.Group.Pattern | Select-Object -Unique).Count -eq $patterns.Count
} | 每個物件的名稱
以上輸出那些符合所有模式的檔案的完整路徑。
Microsoft.PowerShell.Commands.MatchInfo實體,Select-String輸出...
...使用Group-Object cmdlet,按其.Path屬性(輸入檔案的完整路徑)進行分組。
$_.Group.Pattern根據Group-Object輸出的Microsoft.PowerShell.Commands.GroupInfo實體,使用成員列舉提取觸發每個匹配的模式陣列。
Select-Object -Unique將實際匹配的模式陣列縮小到其包含的unique(獨特)模式。
結果陣列與輸入模式的計數相匹配(-eq $patterns.Count)意味著所有輸入模式被找到(至少一次),在傳遞給Where-Object的腳本塊中使用它意味著只有匹配組被輸出。
最后,ForEach-Object Name輸出每個匹配組的.Name屬性,其中包含傳遞給Group-Object -Property的分組屬性的(字串化)值,即手頭的每個輸入檔案的完整路徑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309304.html
標籤:
上一篇:python中的自我和引數傳輸
