Je cherche un fichier dans tous les dossiers.
Copyforbuild.bat
est disponible dans de nombreux endroits et j'aimerais effectuer une recherche récursive.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Comment puis-je le faire dans PowerShell?
Utilisez la cmdlet Get-ChildItem avec le commutateur -Recurse
:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Lors de la recherche de dossiers dans lesquels vous pourriez obtenir une erreur basée sur la sécurité (par exemple, C:\Users
), utilisez la commande suivante:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
J'utilise ceci pour rechercher des fichiers, puis PowerShell affiche le chemin d'accès complet aux 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 va rechercher n'importe quel dossier du lecteur C:\
commençant par Word Folder
. Ainsi, 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 son extension. Si vous souhaitez rechercher un fichier avec une certaine extension, mais que vous 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
Travaillera aussi
Essaye ça:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
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' }
Voici la méthode que j'ai finalement mise au point après avoir lutté:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Pour rendre la sortie plus propre (uniquement le 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 des fichiers/répertoires, utilisez pas utilisez -File
ou -Directory
(voir ci-dessous pourquoi.). Utilisez plutôt ceci pour les fichiers:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
et supprimez le -eq $false
pour les répertoires. Do not laissez un caractère générique de fin tel que bin/*
.
Pourquoi ne pas utiliser les commutateurs intégrés? Ils sont terribles et suppriment les caractéristiques au hasard. Par exemple, pour utiliser -Include
avec un fichier, vous devez terminer le chemin par un caractère générique. Cependant, ceci désactive le commutateur -Recurse
sans vous dire:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Vous penseriez que cela vous donnerait tous les *.lib
s de tous les sous-répertoires, mais il 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 quelque raison que ce soit, cela ne 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 associé à gci
-Path
est la position 0 par défaut, vous pouvez donc créer le chemin du premier argument-Recurse
est associé à -s
-Include
n'a pas de raccourci