eizbaer
Goto Top

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

Content-ID: 85663

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

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

54487
54487 16.04.2008 um 12:52:26 Uhr
Goto Top
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.
Eizbaer
Eizbaer 16.04.2008 um 12:57:36 Uhr
Goto Top
nein, im Verzeichnis liegen die Dateien index_1.php index_2.php index_3.php etc. und alle sollen nach der Inhaltsänderung wieder so heißen wie vorher
bastla
bastla 16.04.2008 um 13:49:26 Uhr
Goto Top
Hallo Eizbaer und willkommen im Forum!

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
)
Etwas komprimierter:
@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
Eizbaer
Eizbaer 17.04.2008 um 09:46:11 Uhr
Goto Top
super das klappt, aber leider nicht mein Ursprungsscript.

Wenn eine Zeile gefunden wird mit nur Leerzeichen, dann wird "ECHO ist ausgeschaltet (OFF). in dieser geschrieben.

Wie kann ich dieses umgehen?
bastla
bastla 17.04.2008 um 09:49:13 Uhr
Goto Top
Hallo Eizbaer!

echo\!text!>>%tempfile%

Grüße
bastla
Eizbaer
Eizbaer 17.04.2008 um 10:01:12 Uhr
Goto Top
super das klappt.

Noch ein Problem in der neuen Datei sind alle ! (Ausrufungszeichen gelöcht), wie kann das sein?
bastla
bastla 17.04.2008 um 10:12:22 Uhr
Goto Top
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":
@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
Eizbaer
Eizbaer 17.04.2008 um 14:23:06 Uhr
Goto Top
Danke aber ich bin zu blond dafür face-smile

ich verstehe nicht wohin goto :eof führen soll.

Ich werde doch einen profi dran lassen müssen
54487
54487 17.04.2008 um 14:29:07 Uhr
Goto Top
eof ist eine vordefinierte Sprungmarke für EndOfFile

Am Ende von ProcessLine allerdings m. E. überflüssig.
Eizbaer
Eizbaer 17.04.2008 um 14:47:13 Uhr
Goto Top
es wird leider keine tmptxt.txt datei erzeugt face-sad
54487
54487 17.04.2008 um 14:49:49 Uhr
Goto Top
Ohne das jetzt nachzuvollziehen (ich habe schon mal .php und .pdf verwechselt face-smile ):
durch "move %tempfile% %%i" wird die tmptxt.txt ja auch verschoben (umbenannt), also ist sie auch nicht mehr vorhanden.
Eizbaer
Eizbaer 17.04.2008 um 14:51:36 Uhr
Goto Top
es wird keine tmptxt.txt erzeugt, der move befehl gibt ja fehlermeldung aus, das keine datei existiert
bastla
bastla 17.04.2008 um 15:22:34 Uhr
Goto Top
@54487
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.

@Eizbaer
Das erste "goto :eof" stellt sicher, dass das Unterprogramm nicht nach Bearbeitung aller passenden PHP-Dateien nochmals ausgeführt wird.

Grüße
bastla
bastla
bastla 17.04.2008 um 15:29:04 Uhr
Goto Top
@Eizbaer

Ändere bitte "echo off" auf "echo on" und starte den Batch dann von der Kommandozeile mit
Batchname>Log.txt
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 face-wink) , poste den Inhalt der Log-Datei.

Sinnvoll wird es natürlich sein, zum Testen zB nur 3 PHP-Dateien zu verwenden.

Grüße
bastla
Eizbaer
Eizbaer 17.04.2008 um 15:44:17 Uhr
Goto Top
set "text=<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 TransitionalEN">" & call :ProcessLine
">" ist syntaktisch an dieser Stelle nicht verarbeitbar.


Orginaltext:
<!DOCTYPE HTML PUBLIC "-
W3CDTD HTML 4.01 TransitionalEN">
54487
54487 17.04.2008 um 15:47:48 Uhr
Goto Top
Orginaltext:
<!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. face-plain
Eizbaer
Eizbaer 17.04.2008 um 15:59:32 Uhr
Goto Top
Aber die Endung "> kommt leider öffter vor !
54487
54487 17.04.2008 um 16:03:50 Uhr
Goto Top
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 ?
Eizbaer
Eizbaer 17.04.2008 um 16:05:04 Uhr
Goto Top
naja, wenn man da mehrere Änderungen per script gleichzeitig machen könnte, dann ja
54487
54487 17.04.2008 um 16:07:17 Uhr
Goto Top
Sowas z. B. setupsr.exe von ftp://ftp.hs-niederrhein.de/public_html/pcw9coip.htm
bastla
bastla 17.04.2008 um 17:03:13 Uhr
Goto Top
@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 face-wink):
@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
Eizbaer
Eizbaer 18.04.2008 um 07:34:57 Uhr
Goto Top
VBScript ist ganz neu für mich face-sad)

diese Datei nenne ich dann xxx.vbs? und kann sie dann abspielen?

Wenn Ja dann kommt Fehlermeldung

Zeile: 2
Fehler: '='erwartet
Code: 800A03F3
bastla
bastla 18.04.2008 um 07:43:58 Uhr
Goto Top
Hallo Eizbaer!

Nein - ist weiterhin ein Batch (der sich das benötigte Script selbst erzeugt und aufruft).

Grüße
bastla
Eizbaer
Eizbaer 18.04.2008 um 07:57:13 Uhr
Goto Top
das klappt super, danke


kann man mit den vbs auch z.B. 2 sachen gleichzeitig verändern?

z.B. .pdf ind .dxf und .php in .htm ?
bastla
bastla 18.04.2008 um 08:47:49 Uhr
Goto Top
Hallo Eizbaer!

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
Eizbaer
Eizbaer 18.04.2008 um 09:02:01 Uhr
Goto Top
Super

Schön, was nur bei 2-3 sinn macht, ich habe aber leider 9 face-big-smile

Wobei ich das jetzt auch damit geschafft habe face-smile


kann man auch 2 Dateiendungen gleichzeitig editieren?
bastla
bastla 18.04.2008 um 11:40:43 Uhr
Goto Top
Hallo Eizbaer!

Zumindest für's nächste Mal face-wink 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"  
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:
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
Eizbaer
Eizbaer 18.04.2008 um 13:17:17 Uhr
Goto Top
jetzt Funktioniert alles,

ich danke euch für eure Hilfe