Inhalt von Dateien in einem Verzeichnis ändern
Da ich noch nie eine schleife programmiert habe brauche ich eure Hilfe.
Eine Datei alleine kann ich verändern:
@echo off
setlocal enabledelayedexpansion
set "filename=index_1.php"
set "tempfile=tmptxt.txt"
for /F "delims=" %%a in (%filename%) do (
set text=%%a
set text=!text:.pdf=.dxf!
echo !text!>>%tempfile%
)
del %filename%
ren %tempfile% %filename%
Ich möchte aber gerne alle Dateien mit index_*.php verändern die in einem Verzeichnis liegen.
Danke im Vorraus für eure Hilfe
Eine Datei alleine kann ich verändern:
@echo off
setlocal enabledelayedexpansion
set "filename=index_1.php"
set "tempfile=tmptxt.txt"
for /F "delims=" %%a in (%filename%) do (
set text=%%a
set text=!text:.pdf=.dxf!
echo !text!>>%tempfile%
)
del %filename%
ren %tempfile% %filename%
Ich möchte aber gerne alle Dateien mit index_*.php verändern die in einem Verzeichnis liegen.
Danke im Vorraus für eure Hilfe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 85663
Url: https://administrator.de/contentid/85663
Ausgedruckt am: 26.11.2024 um 08:11 Uhr
28 Kommentare
Neuester Kommentar
Wenn ich das richtig verstehe, willst du den Dateien lediglich eine andere Endung verpassen?
Dazu reicht ein Einzeiler: ren index_?.php index_?.dxf
Sollte ich das falsch verstehen, bitte mal erläutern, was du eigentlich erreichen willst.
Dazu reicht ein Einzeiler: ren index_?.php index_?.dxf
Sollte ich das falsch verstehen, bitte mal erläutern, was du eigentlich erreichen willst.
Hallo Eizbaer und willkommen im Forum!
Mit Schleife über alle passenden Dateien sollte das (allerdings ungetestet) so gehen:
Etwas komprimierter:
Grüße
bastla
Mit Schleife über alle passenden Dateien sollte das (allerdings ungetestet) so gehen:
@echo off
setlocal enabledelayedexpansion
set "tempfile=tmptxt.txt"
for %%i in (index_*.php) do (
for /F "delims=" %%a in (%%i) do (
set text=%%a
set text=!text:.pdf=.dxf!
echo !text!>>%tempfile%
)
del %%i
ren %tempfile% %%i
)
@echo off & setlocal enabledelayedexpansion
set "tempfile=tmptxt.txt"
for %%i in (index_*.php) do (
for /F "delims=" %%a in (%%i) do (
set text=%%a
echo !text:.pdf=.dxf!>>%tempfile%
)
move %tempfile% %%i
)
Grüße
bastla
Hallo Eizbaer!
Das liegt an der "delayedexpansion" - die braucht die "!" als Ersatz für "%" und kann sie daher nicht mehr als gewöhnliche Zeichen darstellen.
Ansatz ohne "delayedexpansion":
Grüße
bastla
Das liegt an der "delayedexpansion" - die braucht die "!" als Ersatz für "%" und kann sie daher nicht mehr als gewöhnliche Zeichen darstellen.
Ansatz ohne "delayedexpansion":
@echo off & setlocal
set "tempfile=tmptxt.txt"
for %%i in (index_*.php) do (
for /F "delims=" %%a in (%%i) do set "text=%%a" & call :ProcessLine
move %tempfile% %%i
)
goto :eof
:ProcessLine
echo %text:.pdf=.dxf%>>%tempfile%
goto :eof
Grüße
bastla
eof ist eine vordefinierte Sprungmarke für EndOfFile
Am Ende von ProcessLine allerdings m. E. überflüssig.
Am Ende von ProcessLine allerdings m. E. überflüssig.
Ohne das jetzt nachzuvollziehen (ich habe schon mal .php und .pdf verwechselt ):
durch "move %tempfile% %%i" wird die tmptxt.txt ja auch verschoben (umbenannt), also ist sie auch nicht mehr vorhanden.
durch "move %tempfile% %%i" wird die tmptxt.txt ja auch verschoben (umbenannt), also ist sie auch nicht mehr vorhanden.
@54487
@Eizbaer
Das erste "goto :eof" stellt sicher, dass das Unterprogramm nicht nach Bearbeitung aller passenden PHP-Dateien nochmals ausgeführt wird.
Grüße
bastla
eof ist eine vordefinierte Sprungmarke für EndOfFile
Am Ende von ProcessLine allerdings m. E. überflüssig.
Stimmt; allerdings habe ich es mir angewöhnt, diese (nicht störende) Zeile trotzdem zu verwenden, da gelegentlich ein Batch vom Fragesteller in Eigenregie noch um weitere Unterprogramme ergänzt wird - spätestens dann wird das definierte Ende dieses Unterprogrammes benötigt.Am Ende von ProcessLine allerdings m. E. überflüssig.
@Eizbaer
Das erste "goto :eof" stellt sicher, dass das Unterprogramm nicht nach Bearbeitung aller passenden PHP-Dateien nochmals ausgeführt wird.
Grüße
bastla
@Eizbaer
Ändere bitte "echo off" auf "echo on" und starte den Batch dann von der Kommandozeile mit
Die so erstellte Datei "Log.txt" enthält dann den Ablauf, wobei jeder Befehl vor seiner Ausführung zunächst angezeigt wird.
Wenn Du selbst nicht daraus schlau werden solltest (eine Permanentblondierung wird's ja wohl nicht sein ) , poste den Inhalt der Log-Datei.
Sinnvoll wird es natürlich sein, zum Testen zB nur 3 PHP-Dateien zu verwenden.
Grüße
bastla
Ändere bitte "echo off" auf "echo on" und starte den Batch dann von der Kommandozeile mit
Batchname>Log.txt
Wenn Du selbst nicht daraus schlau werden solltest (eine Permanentblondierung wird's ja wohl nicht sein ) , poste den Inhalt der Log-Datei.
Sinnvoll wird es natürlich sein, zum Testen zB nur 3 PHP-Dateien zu verwenden.
Grüße
bastla
Orginaltext:
<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 Transitional//EN">
<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 Transitional//EN">
Aua. Wobei sich mir die Frage aufdrängt, was diese Zeile in einer .php-Datei zu suchen hätte.
Aber die Endung "> kommt leider öffter vor !
Schon klar. Da muss bastla ran. ;)
Wäre da nicht ein simpler Editor mit Search&Replace-Funktion einfacher, z. B. EditPad ?
Sowas z. B. setupsr.exe von ftp://ftp.hs-niederrhein.de/public_html/pcw9coip.htm
@Eizbaer und nachdenker!
Unter diesen Voraussetzungen weiter mit Batch herumzuspielen, halte ich für nicht sinnvoll - zumindest, wenn es nur Batch sein soll - daher lassen wir die reine Ersetzungsarbeit doch von einem VBScript erledigen (damit bleiben dann sogar die Leerzeilen dort, wo sie auch vorher schon waren ):
Grüße
bastla
Unter diesen Voraussetzungen weiter mit Batch herumzuspielen, halte ich für nicht sinnvoll - zumindest, wenn es nur Batch sein soll - daher lassen wir die reine Ersetzungsarbeit doch von einem VBScript erledigen (damit bleiben dann sogar die Leerzeilen dort, wo sie auch vorher schon waren ):
@echo off & setlocal
set "R=%temp%\Repl.vbs"
echo F=WScript.Arguments(0):Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(F).ReadAll:fso.CreateTextFile(F,True).Write Replace(T,".pdf",".dxf")>%R%
for %%i in (index_*.php) do cscript //nologo %R% "%%~i"
Grüße
bastla
Hallo Eizbaer!
Wenn's nur noch eine zweite Ersetzung sein soll, mogle ich die noch dazu:
Grüße
bastla
Wenn's nur noch eine zweite Ersetzung sein soll, mogle ich die noch dazu:
@echo off & setlocal
set "R=%temp%\Repl.vbs"
echo F=WScript.Arguments(0):Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(F).ReadAll:fso.CreateTextFile(F,True).Write Replace(Replace(T,".pdf",".dxf"),".php",".htm")>%R%
for %%i in (index_*.php) do cscript //nologo %R% "%%~i"
Grüße
bastla
Hallo Eizbaer!
Zumindest für's nächste Mal die Version für multiple Ersetzungen und mehrere Dateitypen:
Die einzelnen Ersetzungspaare sind jeweils nach dem Muster "Von=Nach", durch ";" getrennt, in der Zeile "echo P=Split(..." einzutragen. Sollte das Trennzeichen selbst Teil eines Textes sein, kannst Du auch ein anderes (zB "#") wählen, also die Zeile etwa so schreiben:
Für mehrere zu bearbeitende Dateiendungen kannst Du die letzte Zeile kopieren und das Dateimuster in der Klammer jeweils anpassen.
Grüße
bastla
Zumindest für's nächste Mal die Version für multiple Ersetzungen und mehrere Dateitypen:
@echo off & setlocal
set "R=%temp%\Repl.vbs"
echo P=Split(".pdf=.dxf;.php=.htm",";")>%R%
echo U=UBound(P):For i=0 To U:P(i)=Split(P(i),"="):Next:F=WScript.Arguments(0)>>%R%
echo Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(F).ReadAll>>%R%
echo For i=0 To U:T=Replace(T,P(i)(0),P(i)(1)):Next:fso.CreateTextFile(F,True).Write T>>%R%
for %%i in (index_*.php) do cscript //nologo %R% "%%~i"
for %%i in (index_*.htm) do cscript //nologo %R% "%%~i"
echo P=Split(".pdf=.dxf#.php=.htm","#")>%R%
Für mehrere zu bearbeitende Dateiendungen kannst Du die letzte Zeile kopieren und das Dateimuster in der Klammer jeweils anpassen.
Grüße
bastla