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?
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)
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","") }
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
Utilisez BaseName pour le nom du fichier sans l’extension de fichier.
Get-ChildItem -Path ".\*.js" | Sort-Object Length -Descending | ForEach-Object {
$_.BaseName
}