web-dev-qa-db-fra.com

Comment obtenir uniquement des répertoires utilisant Get-ChildItem?

J'utilise PowerShell 2.0 et je souhaite canaliser tous les sous-répertoires d'un certain chemin. La commande suivante affiche tous les fichiers et répertoires, mais je ne vois pas comment filtrer les fichiers.

Get-ChildItem c:\mypath -Recurse

J'ai essayé d'utiliser $_.Attributes pour obtenir les attributs, mais je ne sais pas comment construire une instance littérale de System.IO.FileAttributes à laquelle le comparer. En cmd.exe ce serait 

dir /b /ad /s
193
Peter Hull

Pour les versions de PowerShell inférieures à 3.0:

L'objet FileInfo renvoyé par Get-ChildItem a une propriété "base", PSIsContainer. Vous voulez sélectionner uniquement ces éléments.

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }

Si vous voulez les noms de chaînes brutes des répertoires, vous pouvez faire

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

Pour PowerShell 3.0 et versions supérieures:

dir -Directory
244
xcud

Dans PowerShell 3.0, c'est plus simple:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
163
iraSenthil
Get-ChildItem -dir #lists only directories
Get-ChildItem -file #lists only files

Si vous préférez les alias, utilisez

ls -dir #lists only directories
ls -file #lists only files

ou

dir -dir #lists only directories
dir -file #lists only files

Pour recurse également des sous-répertoires, ajoutez l’option -r.

ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively 

Testé sur PowerShell 4.0, PowerShell 5.0 (Windows 10) et PowerShell Core 6.0 (Windows 10, Mac et Linux).

44
Sachin Joseph

Une approche plus propre:

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

Je me demande si PowerShell 3.0 a un commutateur qui ne renvoie que des répertoires; cela semble être une chose logique à ajouter.

19
Carlos Nunez

Utilisation:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }
11
Marek Dzikiewicz

De PowerShell v2 et plus récent (k représente le dossier dans lequel vous commencez votre recherche):

Get-ChildItem $Path -attributes D -Recurse

Si vous ne voulez que les noms de dossiers et rien d’autre, utilisez ceci:

Get-ChildItem $Path -Name -attributes D -Recurse

Si vous recherchez un dossier spécifique, vous pouvez utiliser ce qui suit. Dans ce cas, je cherche un dossier appelé myFolder:

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"
6
Bill

Moins de texte est requis avec cette approche:

ls -r | ? {$_.mode -match "d"}
4
jyggorath

Utilisation:

dir -Directory -Recurse | Select FullName

Cela vous donnera une sortie de la structure racine avec le nom du dossier pour les répertoires seulement.

3
Wesley

Une approche un peu plus lisible et simple pourrait être obtenue avec le script ci-dessous:

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

J'espère que cela t'aides!

2
Zorayr

Utilisation:

Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name |  convertto-csv -NoTypeInformation  | Out-File c:\temp\mydirectorylist.csv

Qui fait ce qui suit

  • Obtenez une liste de répertoires à l'emplacement cible: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • Extraire uniquement le nom des répertoires: Select-Object -Property name 
  • Convertir la sortie au format CSV: convertto-csv -NoTypeInformation 
  • Enregistrez le résultat dans un fichier: Out-File c:\temp\mydirectorylist.csv
2
Marty Gomez

La réponse acceptée mentionne

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

pour obtenir une "chaîne brute" . Mais en réalité, les objets de type Selected.System.IO.DirectoryInfo seront retournés. Pour les chaînes brutes, les éléments suivants peuvent être utilisés:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

La différence est importante si la valeur est concaténée en chaîne:

  • avec Select-Object étonnamment foo\@{FullName=bar}
  • avec l'opérateur ForEach- l'attendu: foo\bar
1
sevenforce

Vous voudrez utiliser Get-ChildItem pour obtenir tous les dossiers et fichiers de manière récursive. Et puis dirigez cette sortie dans une clause Where-Object qui ne prend que les fichiers.

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;

foreach ($file in $files) {
  echo $file.FullName ;
}
1
sonjz

Ma solution repose sur l'article TechNet Ce que vous pouvez faire avec la cmdlet Get-ChildItem.

Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}

Je l'ai utilisé dans mon script et cela fonctionne bien.

1
Sarrus

Utilisez celui-ci:

Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"
0
Hansli

Pour répondre spécifiquement à la question initiale (en utilisant IO.FileAttributes):

Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}

Je préfère cependant la solution de Marek (Where-Object { $_ -is [System.IO.DirectoryInfo] }).

0
Nico57