17
septembre
2009
[Divers] Petit script pour la modification d’image en masse
septembre
2009
Un article de dev01
4 Commentaires
Une fois n’est pas coutume, aujourd’hui je ne parle pas directement de .NET mais d’un petit script powershell permettant de modifier en masse des photos.
Ce script utilise les outils du projet libre ImageMagick. Il scanne l’ensemble des sous répertoires du répertoire de démarrage et applique la modification sur toute les images trouvées.
Voici le script :
$i = 1
Get-ChildItem -recurse | foreach { $i++;}
$j = 1
$files = Get-ChildItem -recurse
foreach($fileInfo in $files)
{
$fileName = $fileInfo.Get_FullName();
if( $fileName.Contains(" "))
{
$fileName = $fileName.Replace(" ", "_");
$fileInfo.MoveTo($fileName);
}
Write-Output $fileName
write-progress -activity "Traitement de la photo $fileName" -status "% effectué: $j" -percentcomplete $($j*100/$i);
Start-Process 'mogrify.exe' -ArgumentList -resize,1280,"$fileName" -WindowStyle Hidden -Wait;
$j++
}
Write-Output $i
Get-ChildItem -recurse | foreach { $i++;}
$j = 1
$files = Get-ChildItem -recurse
foreach($fileInfo in $files)
{
$fileName = $fileInfo.Get_FullName();
if( $fileName.Contains(" "))
{
$fileName = $fileName.Replace(" ", "_");
$fileInfo.MoveTo($fileName);
}
Write-Output $fileName
write-progress -activity "Traitement de la photo $fileName" -status "% effectué: $j" -percentcomplete $($j*100/$i);
Start-Process 'mogrify.exe' -ArgumentList -resize,1280,"$fileName" -WindowStyle Hidden -Wait;
$j++
}
Write-Output $i
Suite aux améliorations apportées par Laurent Dardenne voici le script corrigé :
$j = 1
foreach($fileInfo in $($F=Get-ChildItem -recurse;$i=$F.count;$F))
{
$fileName = $fileInfo.Get_FullName();
Write-Host $fileName;
write-progress -activity "Traitement de la photo $fileName" -status "Fichiers lu : $j" -percentcomplete ((++$j/$i)*100);
Start-Process 'mogrify.exe' -Arguments "-resize 1280 `"$fileName`"" -WindowStyle Hidden -wait;
$j++;
}
Write-Host $i
foreach($fileInfo in $($F=Get-ChildItem -recurse;$i=$F.count;$F))
{
$fileName = $fileInfo.Get_FullName();
Write-Host $fileName;
write-progress -activity "Traitement de la photo $fileName" -status "Fichiers lu : $j" -percentcomplete ((++$j/$i)*100);
Start-Process 'mogrify.exe' -Arguments "-resize 1280 `"$fileName`"" -WindowStyle Hidden -wait;
$j++;
}
Write-Host $i
voila en espérant que cela soit utile à quelqu’un
4 Commentaires + Ajouter un commentaire
Archives
- juillet 2012
- mars 2012
- février 2012
- novembre 2011
- octobre 2011
- mars 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- avril 2010
- février 2010
- janvier 2010
- novembre 2009
- octobre 2009
- septembre 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juin 2008
- mai 2008
- avril 2008
- février 2008
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
Je pense que la version de PowerShell v2 que tu utilises, différe de celle dispos sous Windows 7 RTM, les noms des arguments de la commande Start-Process sont différents.
Pour ton problème ceci est du au programme mogrify qui nécessite l’usage de guillemets, si tu veux bénéficier de l’expansion de variable et préciser des guillemets, tu dois dans ce cas les ‘échapper’ (Alt Gr 7) :
Cela fonctionne sous Win7.
Sinon attention à l’usage de Write-output, par défaut la sortie est la console, mais dans une fonction renvoyant un résultat c’est différent, on écrit dans le pipeline.
Mieux vaut utiliser Write-Host, ce sera tjrs le dispositif d’affichage et ça précise l’intention.
Salut,
>>Si tu as une idée la dessus ça m’intéresse.
avec la v2 il est possible de passer une hastable en tant que valeur d’un paramètre.
Faut que je regarde ça sous Windows Seven, je te tiens informé.
Merci Laurent pour ces améliorations.
une chose que j’ai oublié de préciser également, c’est que le script ne supporte les chemin d’accès avec un espace. En effet au moment de passer le chemin en paramètre à mogrify.exe, le système découpe le chemin en 2 argument :-(. Si tu as une idée la dessus ça m’intéresse. A noter que j’ai bien essayé de lui passer le chemin entre «
Salut,
je te propose une petite amélioration :
foreach($fileInfo in $($F=Get-ChildItem -recurse;$i=$F.count;$F)) <br />
{ <br />
$fileInfo.Get_FullName() <br />
} <br />
Elle évite de répéter le parcours du PSDrive courant.
Concernant le calcul du pourcentage j’aurais plutot procédé ainsi :
write-progress -activity "Traitement de la photo $fileName" -status "Fichiers lu : $j" -percentcomplete ((++$j/$i)*100) <br />
Et enfin reste à préciser que le cmdlet Start-Process est spécifique à PowerShell V2.