Je recherche un fichier dans tous les dossiers.
Copyforbuild.bat
est disponible dans de nombreux endroits, et je voudrais effectuer une recherche récursive.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Comment puis-je le faire dans PowerShell?
Je recherche un fichier dans tous les dossiers.
Copyforbuild.bat
est disponible dans de nombreux endroits, et je voudrais effectuer une recherche récursive.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Comment puis-je le faire dans PowerShell?
Réponses:
Utilisez l' applet de commande Get-ChildItem avec le -Recurse
commutateur:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
suivie parls -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) à la fin du nom de fichier. ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"
LIGNE2: $Folder = "C:\Program Files"
LIGNE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
J'utilise ceci pour rechercher des fichiers et puis PowerShell affiche le chemin complet des résultats:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
Vous pouvez toujours utiliser le caractère générique *
dans le FolderName
et / ou FileName.fileExtension
. Par exemple:
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
L'exemple ci-dessus recherchera n'importe quel dossier du C:\
lecteur commençant par le mot Folder
. Donc, si vous avez un dossier nommé FolderFoo
et FolderBar
PowerShell affichera les résultats de ces deux dossiers.
Il en va de même pour le nom de fichier et l'extension de fichier. Si vous souhaitez rechercher un fichier avec une certaine extension, mais ne connaissez pas le nom du fichier, vous pouvez utiliser:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
Ou vice versa:
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Fonctionnera également
Voici la méthode que j'ai finalement trouvée après avoir eu du mal:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Pour rendre la sortie plus propre (uniquement chemin), utilisez:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Pour obtenir uniquement le premier résultat, utilisez:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
Maintenant, pour les choses importantes:
Pour rechercher uniquement les fichiers / répertoires ne pas utiliser -File
ou -Directory
(voir ci - dessous pourquoi). Utilisez-le à la place pour les fichiers:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
et supprimez les -eq $false
répertoires for. Ne laissez pas de caractère générique de fin comme bin/*
.
Pourquoi ne pas utiliser les commutateurs intégrés? Ils sont terribles et suppriment des fonctionnalités au hasard. Par exemple, pour utiliser -Include
avec un fichier, vous devez terminer le chemin avec un caractère générique. Cependant, cela désactive le -Recurse
commutateur sans vous dire:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Vous penseriez que cela vous donnerait tous les *.lib
s dans tous les sous-répertoires, mais cela ne fera que rechercher le niveau supérieur de bin
.
Pour rechercher des répertoires, vous pouvez utiliser -Directory
, mais vous devez ensuite supprimer le caractère générique de fin. Pour une raison quelconque, cela ne se désactivera pas -Recurse
. C'est pour ces raisons que je recommande de ne pas utiliser les drapeaux intégrés.
Vous pouvez raccourcir considérablement cette commande:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
devient
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
est aliasé à gci
-Path
est par défaut à la position 0, vous pouvez donc simplement créer le premier chemin d'argument-Recurse
est aliasé à -s
-Include
n'a pas de sténographieEssaye ça:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
pour exclure des dossiers
Filtrer à l'aide de caractères génériques:
Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse
Filtrage à l'aide d'une expression régulière:
Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
'\ACopyForBuild\.(bat|cmd)\Z'
?