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(" ","_") }
3 Réponses :
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 en outre, dans votre réponse, vous avez manqué le soulignement dans Rename-item code>. Vous devez utiliser
déplacer-item code> à la place:
$ _. Remplacer (...) code> plus vous où remplaçage des espaces avec une chaîne vide. Inclus ceci dans ma réponse. P> p>
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 '' '', ''} code> 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.
N'utilisez pas l'interrupteur de nom, il ne produit que les noms des objets, pas leur chemin complet. Essayez ceci:
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?
Ajout d'un filtre travaillé pour moi:
Get-ChildItem C:\path-to-directory -Recurse -Filter *foo* | Rename-Item -NewName { $_.name -replace 'foo', 'bar'} -verbose