Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

.txt auslesen und dateisuffix ändern

Frage Entwicklung Batch & Shell

Mitglied: shlomo

shlomo (Level 1) - Jetzt verbinden

15.06.2009, aktualisiert 02:39 Uhr, 4878 Aufrufe, 17 Kommentare

hallo,

ich kriege es zum verrecken nicht hin diese batch für Windows zu realisieren 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?
Mitglied: bastla
15.06.2009 um 07:23 Uhr
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
Bitte warten ..
Mitglied: shlomo
15.06.2009 um 12:27 Uhr
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.
Bitte warten ..
Mitglied: pieh-ejdsch
15.06.2009 um 15:29 Uhr
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.

01.
@echo off & setlocal 
02.
if exist pathBMP.txt del /q pathsBMP.txt 2>nul 
03.
for /f  "tokens=*" %%s in ('dir C:\testest\*.bmp /b /s') do (optimum  %%s && del /q "%%s") 
04.
dir C:\testtest\*.png /b /s>>pathsBMP.txt 
05.
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
Bitte warten ..
Mitglied: bastla
15.06.2009 um 15:32 Uhr
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:
01.
@echo off & setlocal 
02.
dir C:\testest\*.bmp /b /s > pathsBMP.txt 
03.
for /f "delims=" %%s in (pathsBMP.txt) do ( 
04.
    optimum "%%s" && move "%%~dpns.png" "%%s" 
05.
)
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]
Bitte warten ..
Mitglied: pieh-ejdsch
15.06.2009 um 15:55 Uhr
@ 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
Bitte warten ..
Mitglied: bastla
15.06.2009 um 16:03 Uhr
@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
Bitte warten ..
Mitglied: shlomo
15.06.2009 um 16:54 Uhr
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

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 ^^
Bitte warten ..
Mitglied: pieh-ejdsch
15.06.2009 um 17:24 Uhr
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
01.
@echo off & setlocal 
02.
for /f  "tokens=*" %%s in ('dir C:\testest\*.bmp /b /s') do (optimum  %%~fs && del /q "%%~fs" && ren "%%~dpns.png" "%%~ns")
Bitte warten ..
Mitglied: shlomo
15.06.2009 um 18:30 Uhr
danke!

funktioniert soweit.
Bitte warten ..
Mitglied: bastla
15.06.2009 um 19:22 Uhr
@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
Bitte warten ..
Mitglied: pieh-ejdsch
15.06.2009 um 23:54 Uhr
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
Bitte warten ..
Mitglied: bastla
16.06.2009 um 00:05 Uhr
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 - 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
Bitte warten ..
Mitglied: pieh-ejdsch
16.06.2009 um 01:41 Uhr
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
Bitte warten ..
Mitglied: bastla
16.06.2009 um 01:55 Uhr
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"? ) - 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
Bitte warten ..
Mitglied: shlomo
16.06.2009 um 14:00 Uhr
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?
Bitte warten ..
Mitglied: pieh-ejdsch
16.06.2009 um 18:28 Uhr
Äääää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

01.
@echo off & setlocal 
02.
for /f "delims=: tokens=1,2" %%i in ('attrib /s c:\testest\*.bmp') do call :work "%%i" "%%j" 
03.
goto :eof 
04.
:work 
05.
set Attrib=%~1 
06.
set File=%~2 
07.
for %%i in ("%Attrib:0,1%" "%Attrib:3,1%" "%Attrib:4,1%" "%Attrib:5,1%") do if not "%%~i" == "" ( 
08.
	set Dagmar= -%%~i 
09.
	set Detlev= +%%~i 
10.
11.
attrib%Dagmar% %2 
12.
optimum %Attrib:-1%:%2 
13.
move %Attrib:-1%:%File:0,-3%png %~nx2 
14.
attrib%Detlev% %2 
15.
goto :eof
so jetzt gehts aber
Gruß Phil
Bitte warten ..
Mitglied: pieh-ejdsch
20.06.2009 um 12:44 Uhr
@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.

01.
@echo off & setlocal 
02.
::Dateiattribute werden auf NULL gesetzt mit der Anwendung, welche die 
03.
::Anwendungsdateiendung erstellt, verarbeitet und mit den Originaldateien 
04.
::ersetzt und die Originalen Attribute wiederherstellt. (Funktioniert vllt auch  
05.
::mit der selben Dateiendung vom Dateifilter.) Um die Unterverzeichnisse 
06.
::nicht zu verarbeiten: ('attrib /s 
07.
::ersetzen mit: ('attrib  
08.
set Anwendung=optimum 
09.
set AnwendungsDateiendung=png 
10.
set Verzeichnis=c:\testest\ 
11.
set Dateifilter=*.bmp 
12.
for /f "delims=: tokens=1,2" %%i in ('attrib /s %Verzeichnis%%Dateifilter%') do call :work "%%i" "%%j" 
13.
:work 
14.
set Dagmar= 
15.
set Detlev= 
16.
set Attrib=%~1 
17.
set File=%~2 
18.
for %%i in (%Attrib:~0,1% %Attrib:~3,1% %Attrib:~4,1% %Attrib:~5,1%) do call :attrib %%i 
19.
%Anwendung% %Attrib:-1%:%2 
20.
move %Attrib:-1%:%File:0,-3%AnwendungsDateiendung% %~nx2 
21.
attrib%Detlev% %2 
22.
goto :eof 
23.
:attrib 
24.
set Dagmar=%Dagmar% -%1 
25.
set Detlev=%Detlev% +%2 
26.
goto :eof

Gruß Phil
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...