chris3000
Goto Top

Variable um eine andere Variable kürzen

Hallo zusammen,

Ich möchte per Batchdatei in Verbindung mit irfanview Dateien kopieren/konvertieren und in einem zweiten Schritt nochmal zusätzlich umbenennen.
Grafisch von irfanview ist das alles kein Thema, aber es soll automatisiert werden.
Ausgangspunkt ist, ich habe ein Quellverzeichnis, wo ca. 6 GB jpg-Dateien drin liegen, diese sollen einmal mit der längsten Seite 500 und einmal mit der längsten Seite 300 (dann aber mit dem Dateinamenzusatz "_vorschau" in ein neues Verzeichnis mit gleicher Verzeichnisstruktur kopiert/konvertiert werden.
Folgende Batchdatei funktioniert schon mal ganz gut, aber was mir noch fehlt, ist der Variableninhalt für das aktuelle Unterverzeichnis, ohne Dateinamen.
Es würde theoretisch auch reichen, wenn ich die Länge der Dateinamenariable !ziel4! auslesen kann und diese von der Variable !ziel3! "abziehen" kann. Aber da klemmts bei mir irgendwie.
Hat jemand eine Idee, einen Tip oder vielleicht sogar ein andere Lösung?
@echo off & setlocal enabledelayedexpansion
set iview=%ProgramFiles%\IrfanView\i_view32.exe
set PfadQuelle=C:\Dokumente\bilder\testquelle
set PfadZiel=E:\Bilder\test
set resize_gross="/resize_long=500 /aspectratio /jpgq=85 /resample"  
set resize_klein="/resize_long=300 /aspectratio /jpgq=85 /resample"  

for /r %PfadQuelle% %%I in (*.jpg) do (
rem  ziel2 kompletter Pfad + Dateiname ohne Laufwerksbuchstabe
 	set ziel2=%%~pnxI
rem ziel3 = Unterverzeichnis + Dateiname, durch abtrennen ab dem 53. Zeichen von ziel2
 	set ziel3=!ziel2:~52,250!
rem ziel4 = nur Dateiname
	set ziel4=%%~nxI
 	%iview% %%I %resize_gross% /ini="C:\Dokumente\iview\gross\" /convert=%PfadZiel%\!ziel3!  

rem 	erster vergeblicher Versuch die Variable zu kürzen
rem 	set ziel5=!ziel3:~-!ziel4!!  
rem 	%iview% %%I %resize_klein% /ini="C:\Dokumente\iview\klein\" /convert=%PfadZiel%\!ziel5!!ziel5!%%~nI_vorschau%%~xI  
)
Vielen Dank im voraus
chris

Content-Key: 94259

Url: https://administrator.de/contentid/94259

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: bastla
bastla 12.08.2008 um 18:18:06 Uhr
Goto Top
Hallo Chris3000!

Falls %ziel3% nur noch einen einzigen "\" enthielte, hättest Du einen passender Delimiter für ein "for /f" (Ergebnis: Ordnername ohne "\") ...
for /f "delims=\" %%a in ("%ziel3%") do set "ziel5=%%a"  
... oder Du übergibst %ziel3% an ein "gewöhnliches for" und extrahierst daraus den Pfad (Ergebnis: Ordnername mit "\" an Anfang und Ende) ...
for %%a in ("C:\%ziel3%") do set "ziel5=%%~pa"  
... oder Du löst es tatsächlich über die Ersetzung (Ergebnis: Ordnername mit "\" am Ende):
set "ziel5=!ziel3:%ziel4%=!"  
Um bei dieser Variante dann auch gleich den abschließenden "\" zu eliminieren:
set "ziel5=!ziel3:\%ziel4%=!"  
Grüße
bastla

[Edit] Zur Sicherheit bei Variante 2 noch ein Laufwerk "spendiert" [/Edit]
Mitglied: chris3000
chris3000 12.08.2008 um 19:27:21 Uhr
Goto Top
Hallo Bastla,

danke für die superschnelle Antwort, hab mich für die vorletzte Lösung entschieden, hatte zwar bei mir nicht 1:1 klappen wollen, aber mit

set "ziel5=!ziel3:%%~nxI=!"  

hats dann funktioniert. So hab ich dann wenigstens immer das aktuelle Unterverzeichnis. Vorher habe ich mittels xcopy gleich schon den Quellverzeichnisbaum aufs Ziel projeziert. So kann ich wenigstens mittels if exist abfragen, ob das Verzeichnis existiert und bei Bedarf anlegen. Als veränderten Dateinamen hat dann gereicht, dass ich es so geschrieben habe.

%PfadZiel%\!ziel5!%%~nI_vorschau%%~xI

Danke nochmal für die Hlfe, dann werde ich das Thema mal als gelöst markieren.
Grüße
chris
Mitglied: chris3000
chris3000 13.08.2008 um 16:49:26 Uhr
Goto Top
Hallo nochmal,

hab meine Batchdatei jetzt etwas erweitert, funktioniert jetzt auch genau so wie ich es haben will.
So weit, so gut. Jetzt hab ich mir nur gedacht, ich könnte die Zeile

set ziel3=!ziel2:~52,250! 

etwas vereinfachen. Im Moment ist es ja so, das ich die Zahl der Zeichen, aus dem Quellverzeichnis manuell eintragen muss, in dem Beispiel die 52. Da ich aber faul bin und die Batch gleich wiederverwendbar machen will, wollte ich die Datei um eine Zählschleife erweitern, welche mir dann die Zahl in eine Variable schmeisst.
Die Variablenzählerei klappt auch, zumindest die Schleife als solches, wenn ich aber die Variable an die Stelle setze, wo die 52 steht, dann hagelt es Fehler. Egal, ob ich die Variable da drin in %% oder in !! setze
Hat da jemand noch einen Tip? Ist zwar nicht wirklich wichtig, aber wäre doch schön face-smile
Vielen Dank im voraus
chris

P.S. Die Zählschleife sieht übrigens so aus, bestimmt nicht das Goldene, aber klappt soweit face-wink

set qzahl=0
for /L %%i in (1,1,160) do (
 	if !tempz! GTR 1 ( 
 		set tempz=!PfadQuelle:~0,-1!
 		set /A qzahl=!qzahl!+1
 	) else (
 		set /A qzahl=!qzahl!-1
 		set qzahl2=!qzahl!
 		goto :schluss
 		)
)
:schluss
Mitglied: bastla
bastla 13.08.2008 um 17:05:50 Uhr
Goto Top
Hallo chris3000!

Stringlängenbestimmung in Batch ist mangels passender Funktion etwas aufwändig (obwohl es mit der Biber-Variante
echo %PfadQuelle%>%temp%\Lang.tmp
for %%i in (%temp%\Lang.tmp) do set /a L=%%~zi-2
oder zB dieser Schleife - "delayedExpansion" wird ja ohnehin bereits benötigt -
set /a L=0
:Loop
if "!PfadQuelle:~%L%,1!" neq "" set /a L+=1 & goto :Loop  
auch etwas einfacher geht), aber hier vermutlich auch gar nicht erforderlich.

Aufgrund Deiner Beispieldaten komme ich zwar nicht auf 52 (sondern nur auf 30 für "C:\Dokumente\bilder\testquelle"), aber es geht doch eigentlich, wenn ich das richtig verstehe, um den relativen Pfad unterhalb von %PfadQuelle% - wenn dem so ist, sollte
set "PfadAbsolut=%%~fi"  
set ziel3=!PfadAbsolut:%PfadQuelle%\=!
funktionieren.

Ansonsten bitte ein entsprechendes Beispiel posten ...

Grüße
bastla
Mitglied: chris3000
chris3000 13.08.2008 um 18:32:23 Uhr
Goto Top
Hallo bastla,

danke für die schnelle Antwort. Der Zweizeiler seht natürlich besser aus, als mein Zählkonstrukt.
Hab ich jetzt einfach mal übernommen. Jetzt kann ich wenigstens auch die Zahl in %% schreiben, so das sie auch wieder genommen wird.
Jetzt tritt aber ein ganz anderes Problem auf, was ich auf Anhieb nicht wirklich finden kann.
Wie in meinem folgenden kompletten Beispiel wird alles so konvertiert, wie ich mir das vorstelle, aber wehe, wenn ich den Quellpfad ändere, dann gibts Fehler. Ich hab in dem Beispiel anfangs eine Zahl aus dem Zählkonstrukt von 59, damit funktioniert alles einwandfrei. Zum Testen, damit erstmal nicht alle Dateien angefasst werden, habe ich die Quelle um ein Verzeichnis tiefer angegeben, in ziel3 steht auch das richtige Ergebnis drin, aber irgendwo klemmts trotz allem noch.
Ich hab das ganze mal so gelassen, wie es ist, inkl. Kommentare.
Gruß
chris

@echo off & setlocal enabledelayedexpansion

rem -------------------------
rem Konfigurationen festlegen
rem -------------------------
set iview=%ProgramFiles%\IrfanView\i_view32.exe
set PfadQuelle=E:\files\home\chrisw\Dokumente\Lieferanten\Lieferantenbilder\test1
set PfadZiel=E:\files\home\chrisw\Dokumente\Lieferanten\test1
set ziel2=""  
set ziel3=""  
set resize_gross="/resize_long=450 /aspectratio /jpgq=85 /resample"  
set resize_klein="/resize_long=180 /aspectratio /jpgq=85 /resample"  

rem --------------------------
rem Feststellen, wie gross die Variable des Quellverzeichnisses ist
rem damit die Zahl zum "Beschneiden", fuer ziel3 nicht selbst gezaehlt werden muss  
rem --------------------------
echo %PfadQuelle%>%temp%\Lang.tmp 
for %%i in (%temp%\Lang.tmp) do set /a L=%%~zi-2
set /a L2=!L!-2

rem --------------------------

rem --------------------------
rem Arbeitsvariablen erstellen und Zielverzeichnis bei Bedarf erstellen
rem --------------------------
for /r %PfadQuelle% %%I in (*.jpg) do (
rem  ziel2 kompletter Pfad + Dateiname ohne Laufwerksbuchstabe
 	set ziel2=%%~pnxI
rem ziel3 = Unterverzeichnis + Dateiname, durch abtrennen ab dem 53. Zeichen von ziel2 
 	set ziel3=!ziel2:~%L2%,250!
rem ziel4 = nur Dateiname 
	set ziel4=%%~nI
rem Leerzeichen aus Dateiname durch Unterstriche ersetzen
	set ziel4=!ziel4: =_!
rem ziel5 = ziel3 gekuerzt durch Dateiname -> Unterverzeichnis,ab PfadZiel/PfadQuelle
 	set "ziel5=!ziel3:%%~nxI=!"  
rem Leerzeichen aus Verzeichnisnamen durch Unterstriche ersetzen
	set "ziel5=!ziel5: =_!"  
rem Kopieren von %%I an weitere Variablen, damit Uebergabe an :konvert funktioniert
	set Ikonvert=%%I
	set Iendung=%%~xI
rem Falls Zielverzeichnis nocht nicht existiert, anlegen
 	if not exist %PfadZiel%\!ziel5! md %PfadZiel%\!ziel5!
rem ---------------------------

rem ---------------------------
rem Falls Zieldatei schon existiert, ??berpr??fen, ob sich das Schreibdatum ge??ndert hat und
rem und wenn ja, dann Konvertierung starten
rem Geprueft wird nur, ob die Hauptdatei existiert, die Vorschaudatei wird ohne Ueberpruefung
rem gleich mit generiert.
rem ---------------------------
 	if exist %PfadZiel%\!ziel5!!ziel4!%%~xI (
 		for /F "tokens=1,2,3,4 delims=:. " %%f in ('dir /a-D /Tw /-C %%I^|find "."') do set zeit1=%%h%%g%%f%%i  
		for /F "tokens=1,2,3,4 delims=:. " %%f in ('dir /a-D /Tw /-C %PfadZiel%\!ziel5!!ziel4!%%~xI^|find "."') do set zeit2=%%h%%g%%f%%i  
		if !zeit1! GTR !zeit2! (
			rem Schreibaktivitaetsstempel bei Quelle neuer, als bei Ziel, dann konvertieren
			call :konvert
		) 
	)else (
		rem Zieldatei existiert noch gar nicht, also sowieso konvertieren
		call :konvert
		)
rem ---------------------------
)
goto :ende

:konvert
rem Per nconvert mit Wasserzeichen nconvert.exe muss im verzeichnis liegen
	nconvert -npcd 2 -size 256x256+0 -ctype grey -corder inter -out jpeg -o %PfadZiel%\!ziel5!!ziel4!!Iendung! -wmfile "E:\files\home\chrisw\Dokumente\iview\logo1_skaliert_klein.png" -wmflag center -ratio -rtype lanczos -rflag decr -rflag orient -resize 0 450 "!Ikonvert!"   
	nconvert -npcd 2 -size 256x256+0 -ctype grey -corder inter -out jpeg -o %PfadZiel%\!ziel5!!ziel4!_vorschau!Iendung! -wmfile "E:\files\home\chrisw\Dokumente\iview\logo1_skaliert_klein.png" -wmflag center -ratio -rtype lanczos -rflag decr -rflag orient -resize 0 180 "!Ikonvert!"   

rem Per irfanview, muss nat??rlich auch installiert sein
rem	%iview% !Ikonvert!! %resize_gross% /ini="E:\files\home\chrisw\Dokumente\iview\gross\" /convert=%PfadZiel%\!ziel5!!ziel4!!Iendung!  
rem  	%iview% !Ikonvert! %resize_klein% /ini="E:\files\home\chrisw\Dokumente\iview\klein\" /convert=%PfadZiel%\!ziel5!!ziel4!_vorschau!Iendung!  
goto :eof
:ende
Mitglied: chris3000
chris3000 14.08.2008 um 15:30:44 Uhr
Goto Top
Ich hab zwar noch nicht die Lösung für das "Warum?", denn bei manchen Quellverzeichnisangaben läufts wunderbar, wenn ich L2 (Zeile 36) statt einer Zahl angebe, bei anderen erscheinen Fehlermeldungen, aber mit dem Verzeichnis, welches ich benutze klappts zumindest, von daher, erstmal nebensächlich.
Einen Fehler hatte ich aber noch in Zeile 61, !Ikonvert! musste noch in " ", da Quellverzeichnisse ja noch mit Leerzeichen ausgestattet sein können.
Also läuft erstmal alles so wie ich mir das wünsche und ich kann einen geplanten Task einrichten, welcher täglich startet, damit falls neue Bilder im Quellverzeichnis erscheinen, automatisch webfähige Dateien + Vorschaubild im Zielverzeichnis erstellt werden. Durch meine kaum vorhande Batcherfahrung, könnte man das Ganze garantiert hier und da optimieren, aber im Moment funktionierts, das reicht. Thema kann damit als komplett gelöst markiert werden face-smile

Vielen Dank nochmal für die Hilfe
chris


P.S. Falls jemand Verwendung dafür hat, hier nochmal die neue Version

@echo off & setlocal enabledelayedexpansion
chcp 1252

rem -------------------------
rem Irfanview Konfigurationen eintragen
rem -------------------------
set iview=%ProgramFiles%\IrfanView\i_view32.exe
set resize_gross="/resize_long=450 /aspectratio /jpgq=85 /resample"  
set resize_klein="/resize_long=180 /aspectratio /jpgq=85 /resample"  
rem -------------------------

rem -------------------------
rem Pfade OHNE abschliessenden Backslash eintragen
rem -------------------------
set PfadQuelle=E:\files\home\chrisw\Dokumente\Lieferanten\Lieferantenbilder
set PfadZiel=E:\files\home\chrisw\Dokumente\Lieferanten\shopbilder
rem -------------------------

rem --------------------------
rem Feststellen, wie gross die Variable des Quellverzeichnisses ist
rem damit die Zahl zum "Beschneiden, f??r ziel3 nicht selbst gezaehlt werden muss  
rem Vielen Dank an Biber und bastla
rem --------------------------
echo %PfadQuelle%>%temp%\Lang.tmp 
for %%i in (%temp%\Lang.tmp) do set /a L=%%~zi-2
set /a L2=!L!-2
rem --------------------------

rem --------------------------
rem Arbeitsvariablen erstellen und Zielverzeichnis bei Bedarf erstellen
rem --------------------------
for /r %PfadQuelle% %%I in (*.jpg,*.tif,*.png,*.JPG,*.TIF,*.PNG,*.gif,*.GIF) do (
rem  ziel2 kompletter Pfad + Dateiname ohne Laufwerksbuchstabe
 	set ziel2=%%~pnxI
rem ziel3 = Unterverzeichnis + Dateiname, durch abtrennen ab dem 53. Zeichen von ziel2 
 	set ziel3=!ziel2:~%L2%,250!
rem ziel4 = nur Dateiname 
	set ziel4=%%~nI
rem Zeichen im Zieldateinamen anpassen
	call :umlaute
rem ziel5 = ziel3 gek??rzt durch Dateiname -> Unterverzeichnis,ab PfadZiel/PfadQuelle
 	set "ziel5=!ziel3:%%~nxI=!"  
rem Leerzeichen aus Verzeichnisnamen durch Unterstriche ersetzen
	set "ziel5=!ziel5: =_!"  
rem Kopieren von %%I an weitere Variablen, damit Uebergabe an :konvert funktioniert
	set Ikonvert=%%I
	set Iendung=%%~xI
rem Falls eine Nicht-jpg Datei dran ist, dann fuer spaeter die Endung auf jpg aendern
	if /i !Iendung! NEQ .jpg set Iendung=.jpg
rem Falls Zielverzeichnis nocht nicht existiert, anlegen
 	if not exist "%PfadZiel%\!ziel5!" md "%PfadZiel%\!ziel5!"  
rem ---------------------------

rem ---------------------------
rem Falls Zieldatei schon existiert, ueberpruefen, ob sich das Schreibdatum geaendert hat und
rem und wenn ja, dann Konvertierung starten
rem Geprueft wird nur, ob die Hauptdatei existiert, die Vorschaudatei wird ohne Ueberpruefung
rem gleich mit generiert.
rem ---------------------------
 	if exist %PfadZiel%\!ziel5!!ziel4!!Iendung! (
 		for /F "tokens=1,2,3,4 delims=:. " %%f in ('dir /a-D /Tw /-C "!Ikonvert!"^|find "."') do set zeit1=%%h%%g%%f%%i  
		for /F "tokens=1,2,3,4 delims=:. " %%f in ('dir /a-D /Tw /-C !PfadZiel!\!ziel5!!ziel4!!Iendung!^|find "."') do set zeit2=%%h%%g%%f%%i  
		if !zeit1! GTR !zeit2! (
			rem Schreibaktivitaetsstempel bei Quelle neuer, als bei Ziel, dann konvertieren
			call :konvert
		) 
	)else (
		rem Zieldatei existiert noch gar nicht, also sowieso konvertieren
		call :konvert
		)

)
goto :ende

:konvert
rem Per nconvert mit Wasserzeichen nconvert.exe muss im verzeichnis liegen
 	nconvert -npcd 2 -size 256x256+0 -ctype grey -corder inter -out jpeg -o %PfadZiel%\!ziel5!!ziel4!!Iendung! -wmfile "E:\files\home\chrisw\Dokumente\iview\logo1_skaliert_klein.png" -wmflag bottom-right -ratio -rtype lanczos -rflag decr -rflag orient -resize 0 450 "!Ikonvert!"   
 	nconvert -npcd 2 -size 256x256+0 -ctype grey -corder inter -out jpeg -o %PfadZiel%\!ziel5!!ziel4!_vorschau!Iendung! -wmfile "E:\files\home\chrisw\Dokumente\iview\logo1_skaliert_ganzklein.png" -wmflag bottom-right -ratio -rtype lanczos -rflag decr -rflag orient -resize 0 180 "!Ikonvert!"   

rem Per irfanview, muss natuerlich auch installiert sein
rem	%iview% !Ikonvert! %resize_gross% /ini="E:\files\home\chrisw\Dokumente\iview\gross\" /convert=%PfadZiel%\!ziel5!!ziel4!!Iendung!  
rem  	%iview% !Ikonvert! %resize_klein% /ini="E:\files\home\chrisw\Dokumente\iview\klein\" /convert=%PfadZiel%\!ziel5!!ziel4!_vorschau!Iendung!  
goto :eof

:umlaute
rem Bestimmte Zeichen fuer Zieldateinamen ersetzen
	set ziel4=!ziel4: =_!
	set ziel4=!ziel4:??=ae!
	set ziel4=!ziel4:??=oe!
	set ziel4=!ziel4:??=ue!
	set ziel4=!ziel4:??=ss!
	set ziel4=!ziel4:??=Ae!
	set ziel4=!ziel4:??=Oe!
	set ziel4=!ziel4:??=Ue!
goto :eof
:ende