web-dev-qa-db-fra.com

Comment récupérer de manière récursive des fichiers portant une extension spécifique dans PowerShell?

Pour un dossier spécifique, je dois répertorier tous les fichiers avec l'extension .js, même s'ils sont imbriqués dans des sous-dossiers, quel que soit leur niveau.

Le résultat pour la console de sortie doit être une liste de noms de fichiers sans extension ligne par ligne pour pouvoir être facilement copié et collé dans une autre application.

Pour le moment, j'essaie ceci, mais dans la console de sortie, je reçois plusieurs méta-informations et pas une simple liste.

Get-ChildItem -Path C:\xx\x-Recurse -File | sort length –Descending

Pourriez-vous s'il vous plaît me donner quelques conseils?

22
GibboK

Si le tri par longueur n'est pas une nécessité, vous pouvez utiliser le paramètre -Name pour que Get-ChildItem ne retourne que le nom, puis utilisez [System.IO.Path]::GetFileNameWithoutExtension() pour supprimer le chemin et l'extension:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File -Name| ForEach-Object {
    [System.IO.Path]::GetFileNameWithoutExtension($_)
}

Si vous souhaitez effectuer un tri par longueur, supprimez le paramètre -Name et indiquez la propriété BaseName de chaque objet FileInfo. Vous pouvez diriger la sortie (dans les deux exemples) vers clip, pour la copier dans le presse-papiers:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File| Sort-Object Length -Descending | ForEach-Object {
    $_.BaseName
} | clip

Si vous voulez le chemin complet, mais sans l'extension, remplacez $_.BaseName par:

$_.FullName.Remove($_.FullName.Length - $_.Extension.Length)
32
Mathias R. Jessen

L'option simple consiste à utiliser la propriété .Name de l'élément FileInfo dans le pipeline, puis à supprimer l'extension:

Get-ChildItem -Path "C:\code\" -Filter *.js -r | % { $_.Name.Replace( ".js","") }
5
Stephen Dunne

Il existe deux méthodes pour filtrer les fichiers: globbing en utilisant un caractère générique ou en utilisant une expression régulière (regex). 

Avertissement: La méthode de remplacement présente l’inconvénient de correspondre également à des fichiers qui ne doivent pas correspondre, comme *.jsx

# globbing with Wildcard filter 
# the error action prevents the output of errors
# (ie. directory requires admin rights and is inaccessible)
Get-ChildItem -Recurse -Filter '*.js' -ErrorAction 'SilentlyContinue' 

# filter by Regex
Where-Object { $_.Name -Match '.*\.js$' }

Vous pouvez ensuite trier par nom ou par taille de fichier selon vos besoins: 

# sort the output 
Sort-Object -PropertyName 'Length'

Formatez-le en une simple liste de chemin et de nom de fichier: 

# format output
Format-List -Property ('Path','Name')

Pour supprimer l'extension de fichier, vous pouvez utiliser une sélection pour mapper le résultat: 

Select-Item { $_.Name.Replace( ".js", "")

En résumé, il existe également une version très courte, que vous ne devriez pas utiliser dans les scripts, car elle est difficilement lisible: 

ls -r | ? { $_.Name -m '.*\.js' } | sort Length | % { $_.Name.Replace( ".js", "") | fl
1
MovGP0

Utilisez BaseName pour le nom du fichier sans l’extension de fichier.

Get-ChildItem -Path ".\*.js" | Sort-Object Length -Descending | ForEach-Object {
    $_.BaseName  
}
0
stomy