我正在尋找C:\ProgramFiles一個名為 .jar 的 jar 檔案log4j-core-x.y.z.jar。我正在嘗試匹配最后一位數字z,它可以是一位或兩位數字 (0-99)。我似乎無法獲得正確的 glob 模式來實作這一點。
Code:
PS C:\Users\Administrator> Get-ChildItem -Path 'C:\Program Files\' -Filter log4j-core-*.*.[1-9][0-9].jar -Recurse -ErrorAction SilentlyContinue -Force | %{$_.FullName}
這不會產生任何結果,但是當我執行所有通配符時,例如, -Filter log4j-core-*.*.*.jar,我得到:
C:\Program Files\apache-log4j-2.16.0-bin\apache-log4j-2.16.0-bin\log4j-core-2.16.0-javadoc.jar
C:\Program Files\apache-log4j-2.16.0-bin\apache-log4j-2.16.0-bin\log4j-core-2.16.0-sources.jar
C:\Program Files\apache-log4j-2.16.0-bin\apache-log4j-2.16.0-bin\log4j-core-2.16.0-tests.jar
C:\Program Files\apache-log4j-2.16.0-bin\apache-log4j-2.16.0-bin\log4j-core-2.16.0.jar
我唯一關心的是C:\Program Files\apache-log4j-2.16.0-bin\apache-log4j-2.16.0-bin\log4j-core-2.16.0.jar,log4j-core-2.16.0.jar
uj5u.com熱心網友回復:
-Filter不支持使用正則運算式或字符范圍進行過濾,例如[A-Z]或[0-9]。感謝mklement0指出它。
來自Get-ChildItem官方檔案的引數說明:
過濾器字串被傳遞到 .NET API 以列舉檔案。API 僅支持
*和?通配符。
試試這個:
Get-ChildItem -Path 'C:\Program Files\' -Filter log4j-core-*.*.??.jar -Recurse -ErrorAction SilentlyContinue -Force |
Where-Object {
$_.Name -match '\.\d{1,2}\.jar$'
# => Ends with a . followed by 1 or 2 digits and the .jar extension
}
uj5u.com熱心網友回復:
Santiago Squarzon 的有用答案提供了一個正則運算式輔助的解決方案,該解決方案有可能執行比手頭案例所需的更復雜的匹配。
讓我用一個基于通配符的解決方案來補充它,該解決方案建立在您自己的嘗試之上:
該
-Filter引數不不支持PowerShell中的通配符語法; 它只支持*和?作為通配符元字符(如圣地亞哥所注),不支持字符范圍/集結構,例如[0-9].相反,
-Filter引數由平臺的檔案系統 API 解釋,這在 Windows 上還具有傳統的怪癖 - 請參閱此答案。也就是說,對于
-Filter支持的模式,它的使用比-Include(見下文)更可取,因為它的性能要好得多,因為它在源頭進行過濾。
相比之下,該
-Include引數確實使用了 PowerShell 的通配符,并且還支持多種模式。
不像正則運算式,字符范圍/組運算式在PowerShell的通配符語言都不能支持復制(量詞)邏輯和匹配一個字符每個(就像?做了任何單個字符;*是唯一的元字符隱含支持重復:零個或多個字符) .
因此,[1-9][0-9]精確匹配2個字符(數字),并且也匹配只是一個數字([0-9])需要一個附加的圖案:
Get-ChildItem -Recurse 'C:\Program Files' -Include log4j-core-*.*.[0-9].jar, log4j-core-*.*.[1-9][0-9].jar -ErrorAction SilentlyContinue -Force |
ForEach-Object FullName
注意事項:
使用
-Include(or-Exclude) without-Recurse不會像人們預期的那樣作業 - 請參閱此答案。從 PowerShell 7.2 開始,由于實施效率低下,
-Recurse與結合-Include遇到性能問題 - 請參閱GitHub 問題 #8662。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/381810.html
下一篇:如何在txt檔案中回傳方法的內容
