我有一個包含數千行的文本檔案,其中包含目錄路徑和檔案路徑。我想遍歷文本檔案的每一行并洗掉包含目錄路徑的所有行,并保留所有包含檔案路徑的行。兩行示例(一個目錄,一個來自文本檔案的路徑):
exampleDirectoryPath/tags/10.0.0.8/tools/
exampleFilePath/tags/10.0.0.8/tools/hello.txt
到目前為止,要遍歷文本檔案,我有:
foreach ($line in [System.IO.File]::ReadLines("file.txt")) {
if ($line -match ".*/.*$") {
$line
}
}
目標輸出:
exampleFilePath/tags/10.0.0.8/tools/hello.txt
注意:我不想硬編碼檔案擴展名。有數千個檔案要遍歷,我不知道存在哪些擴展名,所以我想回傳所有這些檔案。
uj5u.com熱心網友回復:
所以,這里的基本邏輯很簡單:
Get-Content "file.txt" | where { $_ is a file path... }
這有點取決于你想如何確定,如果它是一個檔案路徑
如果您的所有目錄路徑都以“/”結尾,您可以簡單地執行以下操作:
where { -not $_.EndsWith("/") }
或者:
where { [system.io.Path]::GetFileName($_) -eq "" }
如果沒有,但您的所有檔案路徑肯定都有擴展名,您可以這樣做:
where { [system.io.Path]::GetExtension($_) -ne "" }
如果所有路徑都確實存在,您也可以這樣做:
where { Test-Path $_ -Type Leaf }
uj5u.com熱心網友回復:
提供一個性能良好的簡潔解決方案:
(Get-Content -ReadCount 0 file.txt) -notmatch '\\$'
使用
-ReadCount 0withGet-Content是一種性能優化,它將輸入檔案中的所有行作為單個陣列物件回傳,而不是逐行收集。- 此外,
-ReadCount 0確保了陣列是輸出即使輸入檔案恰好有只是一個線路。
- 此外,
-notmatch,基于正則運算式的-matchoperator的否定形式,充當具有陣列值 LHS的過濾器,回傳(非)匹配元素(行)(作為新陣列)。- 正則運算式在每個輸入字串(行)的末尾 ( )
\\$逐字匹配。\$
- 正則運算式在每個輸入字串(行)的末尾 ( )
注意:正如您的問題所暗示的那樣,上述解決方案假定目錄可以與檔案正式區分開來,具體取決于輸入檔案中的行是否以結尾/。
uj5u.com熱心網友回復:
我個人不會使用regex它,原因很簡單,即使您可以驗證路徑的模式是否與檔案或檔案夾的模式匹配,但它無法驗證它是否確實存在。我會在你的代碼之后使用這個:
$result = foreach($line in [System.IO.File]::ReadLines("file.txt"))
{
if(([System.IO.DirectoryInfo]$line).Attributes -eq 'Archive')
{
$line
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336626.html
上一篇:根據部分字串或子字串更改列名
