Powershell-Skript für die Verarbeitung von PNGs über exe-Parameter unter Beibehaltung der Quelldateistruktur

619
Tim Burton

Ich arbeite gerade an einem persönlichen Projekt, bei dem ich Zehntausende von PNG-Dateien anpassen muss. Ich weiß wenig oder gar nichts über Scripting, PS oder Programmierung (ich bin Grafiker)

Ich verwende eine Software namens ImageResizer, die die Größe von Bildern ändert.

Diese Software verfügt über Befehlszeilenparameter. Die Parameter, die ich verwende, sind:

/resize auto "XBR 2x <NoBlend>" 

Das nimmt mein Bild und verwendet einen xBRx2-Algorithmus, um seine Größe zu verdoppeln. Diese Ausgabe brauche ich.

Tatsächlich habe ich eine Batch-Datei, die ich aus dem Github der Software herausgeholt habe, die genau das tut, was ich brauche, aber nur für ein einzelnes Bild. Dies ist es als Referenz:

@echo off  for %%F in (Input*.*) do ImageResizer-r129.exe /load "%%F" /resize auto "XBR 2x <NoBlend>" /save "Output\%%~nF%%~xF" 

Hier ist mein Dilemma. Ich habe, wie gesagt, Zehntausende dieser Bilder. Und vielleicht denken Sie "gut, dass cmd das kann" ...

Abgesehen davon sind diese PNGs in einem recht umfangreichen Unterverzeichnis verschachtelt ... und mein Ausgabeordner muss das gleiche Unterverzeichnis wie die Eingabe beibehalten, um zu funktionieren, wozu ich es brauche.

Also, um zu erklären, was ich klarer brauche ...

Ich habe einen INPUT-Ordner. In diesem Ordner befinden sich mehrere Unterordner. Und in jedem dieser Ordner befinden sich weitere Ordner ... wie weit es geht und die Namen dieser Ordner variieren. Am Ende jedes "Zweiges" befinden sich schließlich meine Dateien, die ich zur Verarbeitung meiner Software benötige.

Mein Eingabeordner sieht also irgendwie so aus:

L Eingabe
L_ Meißel
L__ Texturen
L___ Positionen
L____ one.png
L____ two.png
L___ Modellen
L____ one.png
L____ two.png
L_ Artefakte
L__ Texturen
L___ Elementen
L_____gruppe
L___ one.png
L_____ two.png
L____ GruppeTwo
usw

Wie Sie an meinem Beispiel erkennen können, gibt es keine einheitliche Namensstruktur. Soweit ich über Scripting Bescheid weiß, ist ein rekursiver Schalter erforderlich, um alle Pngs zu erfassen.

Alle PNGs aus diesem Eingabeordner müssen mit meinen Parametern durch ImageResizer.exe geleitet werden.

Dann müssen die verarbeiteten PNG-Dateien in einem Ausgabeordner mit dem SAME-Unterverzeichnis Layout als Eingabe ... ausgegeben
werden. Input / Meißel / Texturen / Elemente / Eins.png muss / Ausgabe / Meißel / Texturen / Elemente / speichern .png usw. für jedes PNG in meinem Eingabeordner.

Alternativ könnte das Skript das Originalbild einfach aus dem Eingabeordner überschreiben. So oder so wird das gleiche Ziel erreicht.

Hier ist mein aktuelles PS-Skript, das mein Schwager geschrieben hat, aber nicht fertiggestellt werden konnte. http://pastebin.com/fveGJkRJ

Jede Hilfe wird sehr geschätzt, da es ca. 18.000 pngs gibt, die ich so verarbeiten muss. Ich habe einfach angefangen, mein Batch-Skript immer wieder zu kopieren und einzufügen, wobei jede Eingabe und Ausgabe durch jeden Dateipfad ersetzt wurde, aber das hat viel zu viel Zeit gekostet.

0
Tut mir leid, ich kann nicht mit Powershell helfen, aber ich suche nach etwas Äquivalentem * nix-Befehl "find", für den die Aufgabe trivial wäre. Glenn Randers-Pehrson vor 7 Jahren 0

1 Antwort auf die Frage

0
LotPings

Hier ist ein Powershell-Skript, das macht, was Sie wollen.
Da ich ein Problem mit den Argumenten und Zitaten habe (und keine Zeit), generiert es die erforderlichen Ordner und eine Batch-Datei mit allen Argumenten für ImageResizer-r129.exe, müssen Sie sie separat ausführen.

$ImgRes= "ImageResizer-r129.exe" $Input = "G:\Rebirth Gaming\ImageResizer\input\" $output= "G:\Rebirth Gaming\ImageResizer\Output\"  $Len = $Input.Length  Set-Location $Input  Get-ChildItem *.png -file -recurse| ForEach { $OutPath = $Output+$($_.DirectoryName.Substring($Len)) If (!(Test-Path $OutPath))  "$ImgRes /load `"$_`" /resize auto `"XBR 2x <NoBlend>`" /save `"$OutPath\$($_.Name)`" " } | Out-File $($Output+"Resize.cmd")