Textdatei mit CMD bearbeiten?

4 Antworten

Das Problem an Dateien bearbeiten ist, dass du einer Datei nur Zeilen hinzufügen kannst. Du musst die Datei also komplett neu schreiben, nur mit ein paar Werten ausgetauscht:

@echo off & setlocal enableDelayedExpansion

set "search[0]=7"
set "search[1]=9"

set "oldfile=file.txt"
set "newfile=new.txt"

if exist %newfile% (
    CHOICE /M "%newfile% existiert bereits. Ueberschreiben?"
    if !errorlevel! EQU 1 ( del %newfile% ) else ( exit )
)

for /f "delims=" %%i in (%oldfile%) do (
    set "line=%%i"
    set "line=!line:%search[0]%=%random:~0,1%!
    echo !line:%search[1]%=%random:~0,1%!
)>> %newfile%

oldfile und newfile musst du auf deine Dateinamen anpassen.

Du kannst am Ende natürlich auch die %oldfile% löschen und die %newfile% nach dem alten Dateinamen umbenennen, dann hast du nur eine Datei mit angepassten Werten und altem Dateinamen.

~Tim

Erzesel  10.05.2018, 15:41

ich bin mal fies mit Dir:

file.txt sähe so aus :):


bla und blub 
EmpfaengerName:/12792750717/

Telefon: /096378/
muh und mähhh 7979

und sollte auch so strukturiert bleiben...

mit Deiner Lösung ist leider auch die Telefonnummer und andere zahlen im Text betroffen... O.o

ich klau Dir nicht Deine Lösung, mache aber einem kleines update:

alles  wie  oben
...

set "lineFilter=EmpfaengerName:"
    rem um auch eventuelle Leerzeilen zu erhalten wird der Text  mit Find ein gelesen und die Zeilen nummeriert.
    rem  Find /v ""  ist  eine  doppelte verneinung  /v =ausschließen  "" = nichts  ;) Batchirrsinn
for /f "tokens=1* skip=2 delims=]" %%h in ('find /n /v ""  "%oldfile%"') do  (
      rem  Zeilen  die  nicht  dem Suchmuster  in der variable %lineFilter% entsprechen unberührt lassen. 
      rem  ansonsten die Zahlen ersetzten .
    echo:%%i | find /i /v "%lineFilter%" ||(
        set "line=%%i"        
        set "line=!line:%search[0]%=%random:~0,1%!
        echo !line:%search[1]%=%random:~0,1%!
    )
)>> %newfile%

jetzt bleibt alles wie es ist außer der einen Zeile...

1
timlg07  11.05.2018, 15:13
@Erzesel

Gut, den "unwichtigen Inhalt" davor/danach hatte ich nicht berücksichtigt.
Wusste gar nicht, dass echo:bla auch geht ... gibt es da einen Unterschied zu echo / echo. ?

0
Erzesel  11.05.2018, 18:05
@timlg07

echo: ist im Prinzip das gleiche wie echo. nur etwas schneller . da hatte Dave Bennham (BatchGuru) mal doziert echo. versucht wohl erstmal einen Dateizugriff verzeichniss/. , während echo: ähnlich call:label den Doppelpunkt als Batchintern betrachtet. soviel zur Theorie ich hab's nicht getestet. Wenns von dbennham kommt darf man davon ausgehen das es verifiziert ist...

Anonsten kannst du statt des Punktes so ziemlich jeden Schrott benutzen echo/ /=+[]{}();, geht alles.

1
Erzesel  22.05.2018, 17:00
@timlg07

lass das nicht unsere MöchtergernBatchHackerz lesen XD. Die bauen damit Atombomben gegen ihre Schulrechner...
Wenn dbenham und Co zu Werke gehen ist das meiste zwar interessant aber auch hoch theretisch, trotzdem hatte ich auch schon Fälle wo ich mit dickem Kopf vorm Rechner saß. Offensichtlich nichts falsch und trotzdem ne Fehlermeldung gestern lief das doch noch...

test.cmd

if [%1]==[] ( echo zum Starten ziehe ziehe eine datei auf %~nx0 
  pause
  exit /b
)
echo blah und blub %1
pause

Probiert geht. hm dann wars auf einmal wieder falsch... Bis ich dahinter gestiegen bin das ich die Datei auf Pastebin hatte und 2mal runtergeladen hatte. nun sah der Batchname so aus: test(1).cmd

Fix: entweder man setzt die Variable %~nx0 in Quotes oder man arbeitet mit goto um mögliche Dateinamen mit Klammern aus einem KlammerBlock rauszuhalten... sowas kann einem auch in einem do-block auf die Füße fallen, wo man nicht mal mit goto "davonlaufen" kann.

1
timlg07  23.05.2018, 13:41
@Erzesel

Habs mal probiert mit escapen zu machen ... aber definitiv keine schöne Lösung ;D

set "_nx0=%~nx0"
set "_nx0=%_nx0:(=^(%"
set "_nx0=%_nx0:)=^)%"
if [%1]==[] (
    echo ... %_nx0%
)
pause
0
Laserfab 
Fragesteller
 10.05.2018, 17:38

Danke an euch beide.. Hat super geklappt

1

Klingt nach einer perfekten Übung für ein bisschen C-Programmierung!

Viele Programmiersprachen können das..

C, C++, C#, Java F# ..

Das wird in fast allen gängigen Programmiersprachen möglich sein. Nimm einfach deine liebste☺️

Woher ich das weiß:Berufserfahrung – Softwareentwicklerin