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-Key: 85663

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

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

Mitglied: 54487
54487 Apr 16, 2008 at 10:52:26 (UTC)
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.
Member: Eizbaer
Eizbaer Apr 16, 2008 at 10:57:36 (UTC)
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
Member: bastla
bastla Apr 16, 2008 at 11:49:26 (UTC)
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
Member: Eizbaer
Eizbaer Apr 17, 2008 at 07:46:11 (UTC)
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?
Member: bastla
bastla Apr 17, 2008 at 07:49:13 (UTC)
Goto Top
Hallo Eizbaer!

echo\!text!>>%tempfile%

Grüße
bastla
Member: Eizbaer
Eizbaer Apr 17, 2008 at 08:01:12 (UTC)
Goto Top
super das klappt.

Noch ein Problem in der neuen Datei sind alle ! (Ausrufungszeichen gelöcht), wie kann das sein?
Member: bastla
bastla Apr 17, 2008 at 08:12:22 (UTC)
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
Member: Eizbaer
Eizbaer Apr 17, 2008 at 12:23:06 (UTC)
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
Mitglied: 54487
54487 Apr 17, 2008 at 12:29:07 (UTC)
Goto Top
eof ist eine vordefinierte Sprungmarke für EndOfFile

Am Ende von ProcessLine allerdings m. E. überflüssig.
Member: Eizbaer
Eizbaer Apr 17, 2008 at 12:47:13 (UTC)
Goto Top
es wird leider keine tmptxt.txt datei erzeugt face-sad
Mitglied: 54487
54487 Apr 17, 2008 at 12:49:49 (UTC)
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.
Member: Eizbaer
Eizbaer Apr 17, 2008 at 12:51:36 (UTC)
Goto Top
es wird keine tmptxt.txt erzeugt, der move befehl gibt ja fehlermeldung aus, das keine datei existiert
Member: bastla
bastla Apr 17, 2008 at 13:22:34 (UTC)
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
Member: bastla
bastla Apr 17, 2008 at 13:29:04 (UTC)
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
Member: Eizbaer
Eizbaer Apr 17, 2008 at 13:44:17 (UTC)
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">
Mitglied: 54487
54487 Apr 17, 2008 at 13:47:48 (UTC)
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
Member: Eizbaer
Eizbaer Apr 17, 2008 at 13:59:32 (UTC)
Goto Top
Aber die Endung "> kommt leider öffter vor !
Mitglied: 54487
54487 Apr 17, 2008 at 14:03:50 (UTC)
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 ?
Member: Eizbaer
Eizbaer Apr 17, 2008 at 14:05:04 (UTC)
Goto Top
naja, wenn man da mehrere Änderungen per script gleichzeitig machen könnte, dann ja
Mitglied: 54487
54487 Apr 17, 2008 at 14:07:17 (UTC)
Goto Top
Sowas z. B. setupsr.exe von ftp://ftp.hs-niederrhein.de/public_html/pcw9coip.htm
Member: bastla
bastla Apr 17, 2008 at 15:03:13 (UTC)
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
Member: Eizbaer
Eizbaer Apr 18, 2008 at 05:34:57 (UTC)
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
Member: bastla
bastla Apr 18, 2008 at 05:43:58 (UTC)
Goto Top
Hallo Eizbaer!

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

Grüße
bastla
Member: Eizbaer
Eizbaer Apr 18, 2008 at 05:57:13 (UTC)
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 ?
Member: bastla
bastla Apr 18, 2008 at 06:47:49 (UTC)
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
Member: Eizbaer
Eizbaer Apr 18, 2008 at 07:02:01 (UTC)
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?
Member: bastla
bastla Apr 18, 2008 at 09:40:43 (UTC)
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
Member: Eizbaer
Eizbaer Apr 18, 2008 at 11:17:17 (UTC)
Goto Top
jetzt Funktioniert alles,

ich danke euch für eure Hilfe