web-dev-qa-db-fra.com

Recherche de fichier récursive à l'aide de PowerShell

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?

219
Samselvaprabu

Utilisez la cmdlet Get-ChildItem avec le commutateur -Recurse:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
359
Shay Levy

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
30
Mötz

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}
30
BinaryJoe01
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

Travaillera aussi

11
user3303020

Essaye ça:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
6
Sevenfold

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' }
5
MovGP0

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 *.libs 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
  • Utilisez des guillemets simples pour les espaces dans les noms/chemins, de manière à pouvoir entourer la commande entière de guillemets doubles et à l’utiliser dans l’invite de commande. Faire l'inverse (entourer de guillemets simples) provoque des erreurs
2
hLk