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?
powershell
powershell-2.0
Samselvaprabu
la source
la source
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:
Vous pouvez toujours utiliser le caractère générique
*
dans leFolderName
et / ouFileName.fileExtension
. Par exemple:L'exemple ci-dessus recherchera n'importe quel dossier du
C:\
lecteur commençant par le motFolder
. Donc, si vous avez un dossier nomméFolderFoo
etFolderBar
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:
Ou vice versa:
la source
Lorsque vous recherchez des dossiers où vous pourriez obtenir une erreur basée sur la sécurité (par exemple
C:\Users
), utilisez la commande suivante:la source
Fonctionnera également
la source
Voici la méthode que j'ai finalement trouvée après avoir eu du mal:
Pour rendre la sortie plus propre (uniquement chemin), utilisez:
Pour obtenir uniquement le premier résultat, utilisez:
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:et supprimez les
-eq $false
répertoires for. Ne laissez pas de caractère générique de fin commebin/*
.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: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 debin
.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:
devient
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énographiela source
Essaye ça:
la source
| Where-Object { !$_PSIsContainer }
pour exclure des dossiersFiltrer à l'aide de caractères génériques:
Filtrage à l'aide d'une expression régulière:
la source
'\ACopyForBuild\.(bat|cmd)\Z'
?Pour ajouter à la réponse @ user3303020 et sortir les résultats de la recherche dans un fichier, vous pouvez exécuter
Il peut être plus facile de rechercher le bon fichier de cette façon.
la source