6
votes

remplacer les noms de tous les annuaires et fichiers dans ps

Je veux remplacer tous les caractères d'espace en "_" dans les noms de tous les sous-dossiers et fichiers. Malheureusement, lorsque je tape:

Get-ChildItem -recurse -name | ForEach-Object { Rename-Item $_ $_.replace(" ","_") }


0 commentaires

3 Réponses :


6
votes

Le problème ici est que s'il n'y a pas d'espace dans le nom du fichier, le nom ne change pas. Ceci n'est pas pris en charge par Rename-item . Vous devez utiliser déplacer-item à la place: xxx

en outre, dans votre réponse, vous avez manqué le soulignement dans $ _. Remplacer (...) plus vous où remplaçage des espaces avec une chaîne vide. Inclus ceci dans ma réponse.


3 commentaires

Move-Item: le processus ne peut pas accéder au fichier car il est utilisé par un autre processus. À la ligne: 1 Char: 58 + Get-Childitem -Recurse -Name | Foreach-objet {option-item <<<< 3 $ _ $ _. Remplacer ("" _ ")} + CatégorieInfo: WellsError:


@matandked Voir cette réponse Get-Childitem -Recurse | Où-objet {$ _. Nom -Match ''} | Rename-item -Newname {$ _. Nom -replace '' '', ''} trouvé sur Stackoverflow.com/a/8520172 < / a>


C'est celui qui m'a aidé à comprendre qu'un filtre est nécessaire pour vous assurer que le nom est modifié, sinon vous obtenez des erreurs si vous essayez de renommer un objet au même nom.



15
votes

N'utilisez pas l'interrupteur de nom, il ne produit que les noms des objets, pas leur chemin complet. Essayez ceci: xxx


4 commentaires

Agréable. Pourrait vouloir inclure où-objet {$ _. Attributs -Notmatch 'répertoire'} en tant que filtre supplémentaire. Vous ne pouvez pas renommer un répertoire pendant que vous l'avez itération.


@MichaelBlackBurn Un autre astuce est de trier la collection par le nom complet de l'ordre décroissant. Cela oblige le script à gérer tous les éléments de l'enfant dans un répertoire avant de modifier le répertoire lui-même.


Merci! J'ai fait référence à votre réponse sur quelques autres pages connexes. Vous êtes le seul à contourner les deux problèmes les plus courants.


@ Michaelj.heier pouvez-vous suggérer une modification avec le code de tri en plein nom?



1
votes

Ajout d'un filtre travaillé pour moi:

Get-ChildItem C:\path-to-directory -Recurse -Filter *foo* | Rename-Item -NewName { $_.name -replace 'foo', 'bar'} -verbose


0 commentaires