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
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
Dans PowerShell 3.0, c'est plus simple:
Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
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).
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.
Utilisation:
dir -r | where { $_ -is [System.IO.DirectoryInfo] }
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"
Moins de texte est requis avec cette approche:
ls -r | ? {$_.mode -match "d"}
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.
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!
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
Get-ChildItem \\myserver\myshare\myshare\ -Directory
Select-Object -Property name
convertto-csv -NoTypeInformation
Out-File c:\temp\mydirectorylist.csv
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:
Select-Object
étonnamment foo\@{FullName=bar}
ForEach
- l'attendu: foo\bar
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 ;
}
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.
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 ";"
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] }
).