shlomo
Goto Top

.txt auslesen und dateisuffix ändern

hallo,

ich kriege es zum verrecken nicht hin diese batch für windoof zu realisieren face-sad Ich möchte mittels einer .txt, wo die Pfade der Dateien stehen die Dateisuffixe von .png nach .bmp ändern. Meine Kenntnisse sind schon ein wenig eingerostet. Um hilfe wäre ich dankbar.

In der pathsPNG.txt stehen die Dateipfade

C:\testest\datei0.png
C:\testest\datei1.png
C:\testest\datei2.png
C:\testest\datei3.png
C:\testest\datei4.png


Die Dateien sollen umbenannt werden, nicht der Inhalt der Datei.

C:\testest\datei0.png -> C:\testest\datei0.png
C:\testest\datei1.png -> C:\testest\datei1.png
C:\testest\datei2.png -> C:\testest\datei2.png
C:\testest\datei3.png -> C:\testest\datei3.png
C:\testest\datei4.png -> C:\testest\datei4.png


any ideas?

Content-Key: 118144

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

Printed on: April 19, 2024 at 07:04 o'clock

Member: bastla
bastla Jun 15, 2009 at 05:23:36 (UTC)
Goto Top
Hallo shlomo und willkommen im Forum!

Solltest Du gemeint haben

C:\testest\datei0.png -> C:\testest\datei0.bmp

dann von der Kommandozeile etwa so:
for /f "delims=" %i in (C:\pathsPNG.txt) do @echo ren "%i" "%~ni.bmp"
Das "echo" dient zum Testen und zeigt die Umbenennungsbefehle nur an - wenn diese Anzeige vernünftig aussieht, das "echo" einfach entfernen.

Falls Du einen Batch draus machen willst, jedes in der obigen Zeile vorkommende Prozentzeichen verdoppeln.

Grüße
bastla
Member: shlomo
shlomo Jun 15, 2009 at 10:27:40 (UTC)
Goto Top
hi,

danke für die begrüßung.

das umbenennen hat gut geklappt, jedoch war das mein testszenario. aber irgendwie will er die dateien nicht umbenennen bei der abarbeitung dieser reihenfolge.


dir /R C:\testest\*.png /b /s > pathsBMP.txt
for /f %%s in (pathsBMP.txt) do optimum %%s
for /f %%s in (pathsBMP.txt) do del /s "%%s"
for /f "tokens=13,*" %%s in ('pathsBMP.txt^|find "bmp"') do set png
pause
for /f "delims=" %%s in (pathsBMP.txt) do @echo ren "%%s" "%%~ns.bmp"


Erklärung:
[zeile1] Er sucht alle *.bmp dateien und speichert die Speicherorte in eine pathsBMP.txt
[zeile2] Dann arbeitet das Programm 'optimum' mit den *.bmp .. soweit so gut! Es entstehen danach !!!gleichnamige *.png!!!
[zeile3] Hier sollen alle ursprünglichen *.bmp gelöscht werden, diese Infos nimmt er aus der pathsBMP.txt
[zeile4] Hier öffnet er die pathsBMP.txt und ändert dabei den Inhalt der Dateipfade und zwar den Dateisuffix von !!bmp!! in !!png!! um.
[letzte zeile] Abschliessend sollen dann mittels geänderter pathsBMP.txt auch die Dateien umbenannt werden von !!png!! nach !!bmp!!

Ich habe das gefühl das ich es komplizierter mache, als notwendig. Aber in dieser logischen Reihenfolge, bleiben mir alle Dateipfade erhalten was nunmal wichtig ist beim umbenennen, da nur die '*.png-kopien' der erstmals gefundenen *.bmp-dateien umbenannt werden sollen und nicht andere *.png die sich auch in dem \testest\ ordner befinden.

über weitere hilfe bin ich sehr dankbar.
Member: pieh-ejdsch
pieh-ejdsch Jun 15, 2009 at 13:29:44 (UTC)
Goto Top
Hallo shlomo!

Zitat von @shlomo:
dir /R C:\testest\*.png /b /s > pathsBMP.txt 
[zeile1] Er sucht alle *.bmp dateien und speichert die Speicherorte
in eine pathsBMP.txt
dir /R    ->den Schalter "rekursiv" bei Dir gib es nicht.
/s          -> "subdirectories" (Unterverzeichnisse) sollte dafür genügen
Ja was denn nun ? png suchen oder bmp suchen
Blos Schusselfehler ...? - Kenne ich zu genüge. (von mir)

for /f "tokens=13,*" %%s in ('pathsBMP.txt^|find "bmp"') do set png
diese Zeile ist Überflüssig da "Dir" ja nur was in die Datei schreibt wenn er bmp (png) findet.

@echo off & setlocal
if exist pathBMP.txt del /q pathsBMP.txt 2>nul
for /f  "tokens=*" %%s in ('dir C:\testest\*.bmp /b /s') do (optimum  %%s && del /q "%%s")  
dir C:\testtest\*.png /b /s>>pathsBMP.txt
goto :eof


Wenn die pathBMP.txt Deine Logdatei ist in der Du alle Deine bearbeiteten Bilder Dokumentierst, dann lösche die Zeile 2
Wenn Du die pathBMP.txt gar nich brauchst dann lösche Zeile 2 und Zeile 4
wenn Dein Programm auch Dateien annimmt deren Name Leerzeichen enthalten kann und das Prog auch die Anführungszeichen dafür nimmt dann ersetzt Du in der Zeile 3
optimum %%s
mit
optimum "%%s"


<edit> Code Verbessert (gekürzt) </edit>
Gruß Phil
Member: bastla
bastla Jun 15, 2009 at 13:32:46 (UTC)
Goto Top
Hallo shlomo!

Irgendwie scheinen mir die Dateitypen etwas durcheinander - in Deiner Zeile 1 sollten doch eigentlich *.bmp-Dateien gesucht werden?

Dann sähe der gesamte Ablauf etwa so aus:
@echo off & setlocal
dir C:\testest\*.bmp /b /s > pathsBMP.txt
for /f "delims=" %%s in (pathsBMP.txt) do (  
    optimum "%%s" && move "%%~dpns.png" "%%s"  
)
Die Verknüpfung mit "&&" sorgt dafür, dass nur nach fehlerfreier Beendigung des Programms "optimum" die ursprüngliche .bmp-Datei durch die neue .png-Datei ersetzt wird.

Grüße
bastla

P.S.: Ja, das "setlocal" ist in diesem Fall unnötig, schadet aber auch nicht - und sollte sich der Batch noch auswachsen, steht's schon da ...

[Edit] Wieder einmal mit Verspätung unterwegs ... [/Edit]
Member: pieh-ejdsch
pieh-ejdsch Jun 15, 2009 at 13:55:20 (UTC)
Goto Top
@ bastla

shlomo möchte doch in der pathBMP.txt nur png Dateien stehen haben! Und in Deiner Version steht sowieso nix drin. Die wurden doch vorher gelöscht die bmp's!

@ shlomo
Warum heist die dann pathBMP.txt und nicht pathPNG.txt ?
Komisch wa!

Gruß Phil
Member: bastla
bastla Jun 15, 2009 at 14:03:05 (UTC)
Goto Top
@phil
shlomo möchte doch in der pathBMP.txt nur png Dateien stehen haben!
Warum heist die dann pathBMP.txt und nicht pathPNG.txt ?
Vielleicht, weil laut Erläuterung
[zeile1] Er sucht alle *.bmp dateien und speichert die Speicherorte in eine pathsBMP.txt
tatsächlich .bmp-Dateien hinein sollen ...

Eigentlich ist (zumindest ohne weitere Hinweise von shlomo) die "pathBMP.txt" ohnehin überflüssig und bestenfalls als Dokumentation der verarbeiteten Dateien zu betrachten - da sollte es dann aber eigentlich nur auf Pfad und Dateiname, nicht aber auf den Typ ankommen ...

Ohne Rückmeldung von shlomo werden wir das wohl nicht klären können.

Grüße
bastla
Member: shlomo
shlomo Jun 15, 2009 at 14:54:51 (UTC)
Goto Top
hallo,

zunächst mal danke für eure antworten, werde diese gleich ausprobieren.

nochmal zur schilderung:

Es sollen alle *.bmp gefunden werden und in einer txt gespeichert werden.
Das Programm optimum erstellt dann weitere *png-files aus den gefundenen *bmp-files.

Im Ordnerpfad \testest\ liegen dann:

C:\testest\datei0.bmp
C:\testest\datei0.png
C:\testest\datei1.bmp
C:\testest\datei1.png
C:\testest\datei2.bmp
C:\testest\datei2.png
C:\testest\datei3.bmp
C:\testest\datei3.png
C:\testest\datei4.bmp
C:\testest\datei4.png

Da zum Ende der Batch sollen nur noch die urspünglich erstellen *png's übrig bleiben .. und diese *pngs dann in *bmp wieder umbenannt werden face-smile

Wichtig ist, das er mit der .txt arbeitet, da dort die ursprünglichen pfade gespeichert sind und ich gegen ende nicht *.png's umbenenne in *.bmp, die vorher keine *.bmp dateien waren.

Es tut mir leid wenn ich hier für verwirrung sorge, ich bin selber schon total kirre ^^
Member: pieh-ejdsch
pieh-ejdsch Jun 15, 2009 at 15:24:46 (UTC)
Goto Top
hallo shlomo

Es tut mir leid wenn ich hier für verwirrung sorge.....
soso .....

@ bastla
tatsächlich .bmp-Dateien hinein sollen ...

liegt an der Verwirrung


Also Die pathBMP.txt ist für den ganzen Ablauf der Batch absolut nicht notwendig.
Wie gesagt nur zu Dokumentationzwecken brauchbar, oder wenn ein anderes Programm diese pathBMP.txt Datei benötigt.

Dein Code ist dann also wenn egal wo die Batch ist
@echo off & setlocal
for /f  "tokens=*" %%s in ('dir C:\testest\*.bmp /b /s') do (optimum  %%~fs && del /q "%%~fs" && ren "%%~dpns.png" "%%~ns")  
Member: shlomo
shlomo Jun 15, 2009 at 16:30:16 (UTC)
Goto Top
danke!

funktioniert soweit.
Member: bastla
bastla Jun 15, 2009 at 17:22:08 (UTC)
Goto Top
@phil
Die pathBMP.txt ist für den ganzen Ablauf der Batch absolut nicht notwendig.
Da sind wir uns auf jeden Fall einig ...

Ebenfalls nicht notwendig ist %%~fs - %%s enthält bereits den gesamten Pfad (und wäre dem nicht so - wenn nur "dir /b" verwendet würde - könntest Du den vollständigen Pfad auch nicht per "~f" bekommen) ...

... und wenn schon "del", dann tut's das ohne "/q" für das Löschen einzelner Dateien auch (wobei "del" und "ren" ja aber ohnehin durch "move" erledigt wird).

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Jun 15, 2009 at 21:54:12 (UTC)
Goto Top
Ebenfalls nicht notwendig ist %%~fs - %%s
enthält bereits den gesamten Pfad (und wäre dem nicht so -
wenn nur "dir /b" verwendet würde - könntest Du
den vollständigen Pfad auch nicht per "~f" bekommen)

soso....?
<! Hausaufgabe !>

[win]+[R]
[Enter]
cmd
[Enter]
%homedrive%:
[Enter]
cd %userprofile%
[Enter]
for /f "delims=*" %i in ('dir /b') do @echo %i
[Enter]
for /f "delims=*" %i in ('dir /b') do @echo %~fi
[Enter]

Und was war jetzt nicht Unterschiedlich in der Ausgabe?

</! Hausaufgabe !>

Also für eine Logdatei ist es doch nicht schlecht den Pfad drinstehen zu haben obwohl wird ja nicht gebraucht.

Für den Fall dieser Batch braucht shlomo das %%~fs nicht.
Und wenn mindestens der Laufwerksbuchstabe im "Dir" steht und CMD ist ja sowieso dort im Pfad aktiv bzw. der Pfad steht im Dir.

Aber wenn man aber den Kompletten Pfad der Datei braucht und im subdirectory ist dann brauchste %%~fs.

...aber ohnehin durch "move" erledigt wird...
Hhmmmmm ... war die allgemeine Betriebsblindheit. Habe ich gar nicht gleich gesehen in Deinem Batch.

Ich werde ab jetzt
del Dateib && ren Dateia Dateib

durch
move Dateia Dateib

ersetzen.

Bin immer dankbar für Tipps
Gruß Phil
Member: bastla
bastla Jun 15, 2009 at 22:05:01 (UTC)
Goto Top
Hallo Phil!

Fortsetzung Hausaufgabe:
cd\
[Enter]
for /f "delims=*" %i in ('dir "%userprofile%" /b') do @echo %i
[Enter]
for /f "delims=*" %i in ('dir "%userprofile%" /b') do @echo %~fi
[Enter]
for /f "delims=*" %i in ('dir "%userprofile%" /b') do @echo %userprofile%\%i
[Enter]
"dir /b" liefert nun mal (ohne zusätzliches "/s") nur Name und Extension, aber keinen Pfad (bin oft genug darüber gestolpert, um es jetzt - meistens face-wink - zu berücksichtigen) - umgekehrt (und das hatte ich oben gemeint) wird aber bei Verwendung von "/s" auf jeden Fall ein vollständiger Pfad erzeugt, auch wenn es gar keine Unterordner gibt ...

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Jun 15, 2009 at 23:41:24 (UTC)
Goto Top
Na das ist ja ein Ding.

Erweiterung bei variablen
~d ; ~p ; ~f
Wenn ~d nicht im Variablennamen drinsteht wird das Aktuelle Batch / CMD Verzeichnis dafür genommen.

Also werden Variablen von Batchparametern bzw forSchleifen immer nur zu dem Pfad aufgelöst, wie der Pfad in der Variable ist, wenn der Laufwerksbuchstabe in der Variable Vorhanden ist.

Hhmm Moment mal! Hab ich das nicht schon vorhin irgendwie geschrieben???
Hhmmm tatsächlich. Da habe ich ja schon vorher beantwortet was ich schon immer wissen wollte. Sachen gibts....

Und wenn Kein Laufwerksbuchstabe in der Variable drinsteht, wird der aktuelle Pfad der forSchleife bzw. Batch Verwendet PLUS den Rest der in der Variable steht.

Hab ich ja wieder Stoff für meine Anleitung.

Aber warum gibt Dir den Kompletten pfad bei /s aus?
Im Help steht: Listet Dateien und alle Unterverzeichnisse auf

Was der Bill da mal wieder Verzapft hat ...also echt Windows! Drunter bedeuted also ich Liste auch drüber auf!

Also geht der Batch nur wenn der Batch im DirVerzeichnis ist oder /s genommen wird.

Gruß Phil
Member: bastla
bastla Jun 15, 2009 at 23:55:52 (UTC)
Goto Top
Hallo Phil!
Also werden Variablen von Batchparametern bzw forSchleifen immer nur zu dem Pfad aufgelöst, wie der Pfad in der Variable ist, wenn der Laufwerksbuchstabe in der Variable Vorhanden ist.
... es sei denn, es wäre eine "gewöhnliche" (ohne "/f") "for"-Schleife bzw es wird "for /r" oder "for /d" verwendet - hier hast Du wieder alle Möglichkeiten, den Pfad/Datei-/Ordnernamen zu zerlegen (oder mit "~f" komplett auszugeben).

Das Problem kommt, wie oben schon beschrieben, von "dir /b", da dieses keine Pfade im Ergebnis mitliefert - wenn Du nun vom dadurch überforderten CMD-Interpreter trotzdem einen Pfad verlangst, bekommst Du eben das Naheliegendste (oder "nächst Liegende"? face-wink) - den aktuellen Pfad.

Also geht der Batch nur wenn der Batch im DirVerzeichnis ist oder /s genommen wird.
... oder Du den Pfad (siehe letzter Teil der "Hausaufgabe") selbst angibst.

Grüße
bastla
Member: shlomo
shlomo Jun 16, 2009 at 12:00:29 (UTC)
Goto Top
ich muss da nochmal meinen eigenen thread hijacken =D

habt ihr eine idee, wie ich vorher die attribute von *bmp dateien entferne und schlussendlich die gleichen wieder setzte???

diesen schritt führe ich immer manuell in der Console aus:

c:\testest\attrib -R -S -A -H *.bmp /s


Meine *.bmp dateien unterscheiden sich darin, dass einige RSA attribute gesetzt haben und einige RSAH. Wenn ich abschliessend die attribute wieder zurücksetzen will, weiss ich nicht mehr welche attribute welche *.bmp datei hatte.

welchen workaround gibt es da?
Member: pieh-ejdsch
pieh-ejdsch Jun 16, 2009 at 16:28:17 (UTC)
Goto Top
Ääääähhmmmm!... der "Dir" hätte Dir ohnehin ohne Option hidden bzw. read-only keine Ausgabe von Files mit genau diesen Attributen ausgegeben!

Hier ist Dein neuer Code shlomo

@echo off & setlocal
for /f "delims=: tokens=1,2" %%i in ('attrib /s c:\testest\*.bmp') do call :work "%%i" "%%j"  
goto :eof
:work
set Attrib=%~1
set File=%~2
for %%i in ("%Attrib:0,1%" "%Attrib:3,1%" "%Attrib:4,1%" "%Attrib:5,1%") do if not "%%~i" == "" (  
	set Dagmar= -%%~i
	set Detlev= +%%~i
)
attrib%Dagmar% %2
optimum %Attrib:-1%:%2
move %Attrib:-1%:%File:0,-3%png %~nx2
attrib%Detlev% %2
goto :eof

so jetzt gehts aber
Gruß Phil
Member: pieh-ejdsch
pieh-ejdsch Jun 20, 2009 at 10:44:18 (UTC)
Goto Top
@shlomo

Hättest ja mal Feedback geben können ob der Code Funktioniert...
Ich hatte diesen nur Ungetestet hingeschrieben.
Solche Schusselfehler sind nicht so tragisch.

Also hier nochmal Diesmal auch getestet.

Dateiverarbeitung mit Versteckten (und) anders gesetzten Attributen.

@echo off & setlocal
::Dateiattribute werden auf NULL gesetzt mit der Anwendung, welche die
::Anwendungsdateiendung erstellt, verarbeitet und mit den Originaldateien
::ersetzt und die Originalen Attribute wiederherstellt. (Funktioniert vllt auch 
::mit der selben Dateiendung vom Dateifilter.) Um die Unterverzeichnisse
::nicht zu verarbeiten: ('attrib /s 
::ersetzen mit: ('attrib  
set Anwendung=optimum
set AnwendungsDateiendung=png
set Verzeichnis=c:\testest\
set Dateifilter=*.bmp
for /f "delims=: tokens=1,2" %%i in ('attrib /s %Verzeichnis%%Dateifilter%') do call :work "%%i" "%%j"  
:work
set Dagmar=
set Detlev=
set Attrib=%~1
set File=%~2
for %%i in (%Attrib:~0,1% %Attrib:~3,1% %Attrib:~4,1% %Attrib:~5,1%) do call :attrib %%i
%Anwendung% %Attrib:-1%:%2
move %Attrib:-1%:%File:0,-3%AnwendungsDateiendung% %~nx2
attrib%Detlev% %2
goto :eof
:attrib
set Dagmar=%Dagmar% -%1
set Detlev=%Detlev% +%2
goto :eof


Gruß Phil