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

Inhalt von Dateien in einem Verzeichnis ändern

Frage Entwicklung Batch & Shell

Mitglied: Eizbaer

Eizbaer (Level 1) - Jetzt verbinden

16.04.2008, aktualisiert 18.04.2008, 4890 Aufrufe, 28 Kommentare

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
28 Antworten
Mitglied: 54487
16.04.2008 um 12:52 Uhr
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.
Bitte warten ..
Mitglied: Eizbaer
16.04.2008 um 12:57 Uhr
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
Bitte warten ..
Mitglied: bastla
16.04.2008 um 13:49 Uhr
Hallo Eizbaer und willkommen im Forum!

Mit Schleife über alle passenden Dateien sollte das (allerdings ungetestet) so gehen:
01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
set "tempfile=tmptxt.txt" 
04.
 
05.
for %%i in (index_*.php) do ( 
06.
	for /F "delims=" %%a in (%%i) do ( 
07.
		set text=%%a 
08.
		set text=!text:.pdf=.dxf! 
09.
		echo !text!>>%tempfile% 
10.
11.
	del %%i 
12.
	ren %tempfile% %%i 
13.
)
Etwas komprimierter:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "tempfile=tmptxt.txt" 
03.
 
04.
for %%i in (index_*.php) do ( 
05.
	for /F "delims=" %%a in (%%i) do ( 
06.
		set text=%%a 
07.
		echo !text:.pdf=.dxf!>>%tempfile% 
08.
09.
	move %tempfile% %%i 
10.
)
Grüße
bastla
Bitte warten ..
Mitglied: Eizbaer
17.04.2008 um 09:46 Uhr
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?
Bitte warten ..
Mitglied: bastla
17.04.2008 um 09:49 Uhr
Hallo Eizbaer!

01.
echo\!text!>>%tempfile%
Grüße
bastla
Bitte warten ..
Mitglied: Eizbaer
17.04.2008 um 10:01 Uhr
super das klappt.

Noch ein Problem in der neuen Datei sind alle ! (Ausrufungszeichen gelöcht), wie kann das sein?
Bitte warten ..
Mitglied: bastla
17.04.2008 um 10:12 Uhr
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":
01.
@echo off & setlocal 
02.
set "tempfile=tmptxt.txt" 
03.
 
04.
for %%i in (index_*.php) do ( 
05.
	for /F "delims=" %%a in (%%i) do set "text=%%a" & call :ProcessLine 
06.
	move %tempfile% %%i 
07.
08.
goto :eof 
09.
 
10.
:ProcessLine 
11.
echo %text:.pdf=.dxf%>>%tempfile% 
12.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Eizbaer
17.04.2008 um 14:23 Uhr
Danke aber ich bin zu blond dafür

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

Ich werde doch einen profi dran lassen müssen
Bitte warten ..
Mitglied: 54487
17.04.2008 um 14:29 Uhr
eof ist eine vordefinierte Sprungmarke für EndOfFile

Am Ende von ProcessLine allerdings m. E. überflüssig.
Bitte warten ..
Mitglied: Eizbaer
17.04.2008 um 14:47 Uhr
es wird leider keine tmptxt.txt datei erzeugt
Bitte warten ..
Mitglied: 54487
17.04.2008 um 14:49 Uhr
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.
Bitte warten ..
Mitglied: Eizbaer
17.04.2008 um 14:51 Uhr
es wird keine tmptxt.txt erzeugt, der move befehl gibt ja fehlermeldung aus, das keine datei existiert
Bitte warten ..
Mitglied: bastla
17.04.2008 um 15:22 Uhr
@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
Bitte warten ..
Mitglied: bastla
17.04.2008 um 15:29 Uhr
@Eizbaer

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

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

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


Orginaltext:
<!DOCTYPE HTML PUBLIC "-
W3 CDTD HTML 4.01 TransitionalEN">
Bitte warten ..
Mitglied: 54487
17.04.2008 um 15:47 Uhr
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.
Bitte warten ..
Mitglied: Eizbaer
17.04.2008 um 15:59 Uhr
Aber die Endung "> kommt leider öffter vor !
Bitte warten ..
Mitglied: 54487
17.04.2008 um 16:03 Uhr
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 ?
Bitte warten ..
Mitglied: Eizbaer
17.04.2008 um 16:05 Uhr
naja, wenn man da mehrere Änderungen per script gleichzeitig machen könnte, dann ja
Bitte warten ..
Mitglied: 54487
17.04.2008 um 16:07 Uhr
Bitte warten ..
Mitglied: bastla
17.04.2008 um 17:03 Uhr
@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 ):
01.
@echo off & setlocal 
02.
set "R=%temp%\Repl.vbs" 
03.
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% 
04.
 
05.
for %%i in (index_*.php) do cscript //nologo %R% "%%~i"
Grüße
bastla
Bitte warten ..
Mitglied: Eizbaer
18.04.2008 um 07:34 Uhr
VBScript ist ganz neu für mich )

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

Wenn Ja dann kommt Fehlermeldung

Zeile: 2
Fehler: '='erwartet
Code: 800A03F3
Bitte warten ..
Mitglied: bastla
18.04.2008 um 07:43 Uhr
Hallo Eizbaer!

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

Grüße
bastla
Bitte warten ..
Mitglied: Eizbaer
18.04.2008 um 07:57 Uhr
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 ?
Bitte warten ..
Mitglied: bastla
18.04.2008 um 08:47 Uhr
Hallo Eizbaer!

Wenn's nur noch eine zweite Ersetzung sein soll, mogle ich die noch dazu:
01.
@echo off & setlocal 
02.
set "R=%temp%\Repl.vbs" 
03.
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% 
04.
 
05.
for %%i in (index_*.php) do cscript //nologo %R% "%%~i"
Grüße
bastla
Bitte warten ..
Mitglied: Eizbaer
18.04.2008 um 09:02 Uhr
Super

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

Wobei ich das jetzt auch damit geschafft habe



kann man auch 2 Dateiendungen gleichzeitig editieren?
Bitte warten ..
Mitglied: bastla
18.04.2008 um 11:40 Uhr
Hallo Eizbaer!

Zumindest für's nächste Mal die Version für multiple Ersetzungen und mehrere Dateitypen:
01.
@echo off & setlocal 
02.
set "R=%temp%\Repl.vbs" 
03.
 
04.
echo P=Split(".pdf=.dxf;.php=.htm",";")>%R% 
05.
 
06.
echo U=UBound(P):For i=0 To U:P(i)=Split(P(i),"="):Next:F=WScript.Arguments(0)>>%R% 
07.
echo Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(F).ReadAll>>%R% 
08.
echo For i=0 To U:T=Replace(T,P(i)(0),P(i)(1)):Next:fso.CreateTextFile(F,True).Write T>>%R% 
09.
 
10.
for %%i in (index_*.php) do cscript //nologo %R% "%%~i" 
11.
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:
01.
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
Bitte warten ..
Mitglied: Eizbaer
18.04.2008 um 13:17 Uhr
jetzt Funktioniert alles,

ich danke euch für eure Hilfe
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst EDI Dateien auf Inhalt prüfen und verschieben (6)

Frage von ThomasKern zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien in einem Verzeichnis mergen - rekursiv (10)

Frage von frad1980 zum Thema Batch & Shell ...

VB for Applications
gelöst Wie mittels VBA beim Import von CSV dateien das Format aller Zellen auf "Zahl" ändern? (2)

Frage von Glibber4 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...