2009-10-06 14 views
19

Je voudrais renommer tous les fichiers jpg dans un dossier pour uniformiser la convention comme Picture00000001.jpg où 00000001 est un compteur.Comment faire une boucle dans les fichiers et les renommer en utilisant PowerShell?

Ce serait une promenade dans le parc en C#, mais je pense que c'est le genre de pain et beurre que PowerShell a été fait pour.

Je devine que quelque chose comme

$files = ls *.jpg 
$i=0 
foreach($f in $files) { Rename-Item $f -NewName "Picture"+($i++)+".jpg" } 

Mais avant de toucher le gaz sur ce que je voudrais 1) mettre en forme le compteur, et 2) ont un certain sens que c'est en fait même une bonne idée .

Si cela ressemble plus à OCD qu'une bonne idée s'il vous plaît parler.

Répondre

23

Vous pouvez le faire assez simplement PowerShell:

ls *.jpg | Foreach -Begin {$i=1} ` 
    -Process {Rename-Item $_ -NewName ("Picture{0:00000000}.jpg" -f $i++) -whatif} 

Si vous re recherche du "basename" et si vous utilisez PowerShell 2.0, utilisez simplement la propriété Basename que PowerShell ajoute à chaque objet FileInfo:

ls *.jpg | Format-Table Basename 

Notez que sur PowerShell 1.0, le PowerShell Community Extensions ajoute la même propriété Basename.

Si l'intention est d'ajouter une chaîne de compteur à basename du fichier lors de l'opération de changement de nom puis essayez ceci:

ls *.jpg | Foreach {$i=1} ` 
    {Rename-Item $_ -NewName ("$($_.Basename){0:00000000#}.jpg" -f $i++) -whatif} 
+0

Désolé pour le décalage entre le titre et la question - j'ai changé le titre. –

+0

Pas de problème, j'ai mis à jour ma réponse en conséquence. –

+0

Whoa, vous pouvez donner individuellement un bloc de script 'begin' et' process' à 'ForEach-Object'? Je dois revoir certains problèmes de golf au PE. – Joey

2

Essayez ceci pour obtenir le FilenameWithOutExtension

$ f.DirectoryName + "\" + $ f.BaseName

Questions connexes