Tüm klasörlerde bir dosya arıyorum.
Copyforbuild.bat
birçok yerde kullanılabilir ve yinelemeli olarak arama yapmak istiyorum.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
PowerShell'de nasıl yapabilirim?
Tüm klasörlerde bir dosya arıyorum.
Copyforbuild.bat
birçok yerde kullanılabilir ve yinelemeli olarak arama yapmak istiyorum.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
PowerShell'de nasıl yapabilirim?
Yanıtlar:
Anahtarla Get-ChildItem cmdlet'ini kullanın -Recurse
:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
ardındanls -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
sonuna astrik sembolü ( ) ekleyerek kısmi dize yapmak için bu cevabı uyarladım . ****** $File = "Microsoft.OData.Core.NetFX35.V7*"
LINE1 : LINE2: $Folder = "C:\Program Files"
LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
Bu dosyaları bulmak için kullanın ve sonra PowerShell sonuçların tüm yolunu görüntülemek:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
Joker karakteri her zaman ve / veya *
içinde kullanabilirsiniz . Örneğin:FolderName
FileName.fileExtension
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
Yukarıdaki örnek, C:\
sürücüdeki sözcükle başlayan herhangi bir klasörü arayacaktır Folder
. Yani, adında bir klasörünüz varsa FolderFoo
veFolderBar
PowerShell her iki klasörden de sonuçları gösterir.
Aynı şey dosya adı ve dosya uzantısı için de geçerlidir. Belirli bir uzantıya sahip bir dosyayı aramak istiyor ancak dosyanın adını bilmiyorsanız, şunları kullanabilirsiniz:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
Ya da tam tersi:
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Ayrıca çalışacak
İşte sonunda mücadele ettikten sonra bulduğum yöntem:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Çıktıyı daha temiz (yalnızca yol) yapmak için şunu kullanın:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Yalnızca ilk sonucu almak için şunu kullanın:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
Şimdi önemli şeyler için:
Dosyalar için yalnızca aramak için / dizinleri yok değil kullanmak -File
veya -Directory
(neden aşağıya bakınız). Bunun yerine dosyalar için kullanın:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
ve -eq $false
dizinleri kaldırın . Do not gibi sondaki joker bırakın bin/*
.
Neden yerleşik anahtarları kullanmıyorsunuz? Onlar korkunç ve rastgele özellikleri kaldırmak. Örneğin, -Include
bir dosyayla kullanmak için yolu bir joker karakterle sonlandırmanız gerekir. Ancak, bu -Recurse
size söylemeden anahtarı devre dışı bırakır :
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Bunun *.lib
tüm alt dizinlerde size vereceğini düşünürsünüz , ancak yalnızca en üst düzeyde arama yapar bin
.
Dizin aramak için kullanabilirsiniz -Directory
, ancak sondaki joker karakteri kaldırmanız gerekir. Hangi nedenle olursa olsun, bu devre dışı bırakılmaz -Recurse
. Bu nedenlerden dolayı yerleşik bayrakları kullanmamanızı tavsiye ederim.
Bu komutu önemli ölçüde kısaltabilirsiniz:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
olur
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
ile takma gci
-Path
varsayılan 0 konumuna ayarlandığından, ilk bağımsız değişken yolunu oluşturabilirsiniz-Recurse
ile takma -s
-Include
stenografi yokBunu dene:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
Klasörleri hariç tutmak için de kullanabilirsiniz
Joker karakterler kullanarak filtreleme:
Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse
Normal bir ifade kullanarak filtreleme:
Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
'\ACopyForBuild\.(bat|cmd)\Z'
?