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 -Recursecommutateur:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFoldersuivie 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 FolderNameet / 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é FolderFooet FolderBarPowerShell 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 -Fileou -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 $falseré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 -Includeavec un fichier, vous devez terminer le chemin avec un caractère générique. Cependant, cela désactive le -Recursecommutateur sans vous dire:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Vous penseriez que cela vous donnerait tous les *.libs 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'?