taliesin
Goto Top

Mittels Batch Txt-Datei ein Zeichen ändern (altern. Zeile mit Anf)

Moin,
ich habe mich hier seit ein paar Tagen duch einige threads gearbeitet, aber immer kam ich an eine Stelle, die mein Verständnis überstieg.

Folgendes Problem:
Ich habe eine cfg-Datei, in der ich jede Nacht eine Ziffer ändern möchte.
Mein Plan ist, unter Windows per Aufgabenplanung eine Batch-Datei auszuführen.
Der Wert steht mitten in einer Zeile, in der auch Leer- und Anführungszeichen stehen, also sowas wie
texttext("text.text", 5);

Um die 5 geht es mir, die möchte ich täglich ändern. Alles andere soll so bleiben wie es ist (z.B. texttext("text.text", 6); )
Die Datei hat natürlich viele andere Zeilen, die gesuchte hat aber einen klar definierten Inhalt. Die Ziffer ist immer einstellig (Wochentag)

Aus den verschiedenen threads habe ich entnommen, dass normalerweise die Ursprungsdatei zeilenweise in eine neue Datei kopiert wird und die gewünschte Zeile dann durch eine neu erstellte ersetzt wird.

SET QDatei="c:\test 1.txt"  
SET SuchStr=texttext
SET ZDatei="c:\test2.txt"  
setlocal enabledelayedexpansion

for /f "delims=" %%i in ('SuchStr . %QDatei%') do (  
	set line=%%i
	set line=!line:"%SuchStr%"="%Ersatz%"!  
	echo !line! >> %ZDatei%)

Soviel habe ich mir zusammengesucht, es funktioniert natürlich NICHT.
mit findstr %SuchStr% %QDatei% wird mir immerhin die gesuchte Zeile ausgegeben
Leider schaffe ich es nicht, diese Zeile in eine Variable zu bekommen, die ich dann durch eine umgebaute Zeile ersetzen kann.
Ich würde ja gerne so an die Sache herangehen, dass ich die Zeile herauspicke und das Zeichen an der x. Stelle durch das neue Zeichen ersetze, aber diese Möglichkeit scheint es in der Batch wohl nicht zu geben(?).

Könnt Ihr mir auf den richtigen Weg helfen?

Gruß
Tali

Content-Key: 363806

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

Printed on: April 26, 2024 at 01:04 o'clock

Member: rubberman
rubberman Feb 06, 2018 at 20:51:05 (UTC)
Goto Top
Mittels Batch Txt-Datei ein Zeichen ändern
... bedeutet zumindest bei Batch, die gesamte Datei neu zu schreiben.
(altern. Zeile mit Anf)
... klingt schon mal nach einem Plan.
Kannst du mal mit der realen Zeile aufwarten, in Code Tags eingeschlossen (</> Button im Editorfenster) und inclusive Zeileneinrückung, falls vorhanden?

Steffen
Member: Taliesin
Taliesin Feb 07, 2018 at 14:56:13 (UTC)
Goto Top
Hallo,

die originale Zeile lautet

user_2pref("calendar.week.start", 3);  

Gruß
Tali
Mitglied: 135333
135333 Feb 07, 2018 updated at 15:07:26 (UTC)
Goto Top
Powershell
$neuerWert = 6
(gc 'C:\test1.txt') -replace '(?<="calendar\.week\.start",\s*)\d+',$neuerWert | sc 'C:\test1.txt'  
Gruß Snap
Member: Taliesin
Taliesin Feb 07, 2018 at 15:13:41 (UTC)
Goto Top
Sorry, Powershell sagt mir nichts.

Kann ich das in einer startbaren Datei speichern und dann aufrufen?
Mitglied: 135333
135333 Feb 07, 2018 updated at 15:19:49 (UTC)
Goto Top
Sorry, Powershell sagt mir nichts.
Dann wirds Zeit face-big-smile.
Kann ich das in einer startbaren Datei speichern und dann aufrufen?
Sischer dat ...
https://www.windowspro.de/andreas-kroschel/powershell-scripts-ausfuehren

Kannst du sogar direkt in deine Batch einbauen:
powershell.exe -Executionpolicy ByPass -Command "$neuerWert = 6;(gc 'C:\test1.txt') -replace '(?<=\"calendar\.week\.start\",\s*)\d+',$neuerWert | sc 'C:\test1.txt'"  
Member: rubberman
Solution rubberman Feb 07, 2018 at 15:23:43 (UTC)
Goto Top
Teste:
@echo off &setlocal DisableDelayedExpansion

set "src=test 1.txt"  
set "dst=test2.txt"  
set "pattern=\"calendar\.week\.start\""  

set "found="  
for /f "delims=:" %%i in ('findstr /n "%pattern%" "%src%"') do set "found=%%i"  
if not defined found exit /b

setlocal EnableDelayedExpansion
<"!src!" >"!dst!" (  
  for /f %%i in ('type "!src!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "line=" & set /p "line="  
    if %%j==%found% (
      for /f "tokens=1-3 delims=,)" %%k in ("!line!") do (  
        set /a "n=%%l + 1"  
        echo(%%k, !n!^)%%m
      )
    ) else echo(!line!
  )
)

Steffen
Member: Taliesin
Taliesin Feb 07, 2018 at 16:07:09 (UTC)
Goto Top
Hallo rubberman,
danke für Deinen Code, offenbar funktioniert er - eingeschränkt face-wink
Wenn ich Deine Zeile 17 richtig lese, erhöhst Du den gefunden Wert um 1, richtig?
D.h. am nächsten Sonntag würde dort dann eine 8 stehen?

Ich hole mir mit
@ECHO off
set DOW=
for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (  
set DOW=%%g)
den aktuellen Wochentag in die Variable DOW

Ich habe Deinen Code jetzt so abgewandelt:

@echo off &setlocal DisableDelayedExpansion
set DOW=
for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (  
set DOW=%%g)

set "src=test 1.txt"  
set "dst=test2.txt"  
set "pattern=\"calendar\.week\.start\""  

set "found="  
for /f "delims=:" %%i in ('findstr /n "%pattern%" "%src%"') do set "found=%%i"  
if not defined found exit /b

setlocal EnableDelayedExpansion
<"!src!" >"!dst!" (  
  for /f %%i in ('type "!src!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "line=" & set /p "line="  
    if %%j==%found% (
      for /f "tokens=1-3 delims=,)" %%k in ("!line!") do (  
::       set /a "n=%%l + 1" 
        set /a "n=%DOW%"  
        echo(%%k, !n!^)%%m
      )
    ) else echo(!line!
  )
)
und so wie es aussieht, funktioniert er in meinem Sinne, vielen Dank für die Hilfe.

@135333: Danke auch für Deinen Lösungsansatz, ich bleibe erstmal bei dem, was ich zumindest ansatzweise verstehe face-wink

Gruß
Tali
Member: rubberman
Solution rubberman Feb 07, 2018 at 16:23:50 (UTC)
Goto Top
Da du bereits eine Variable DOW hast, brauchst du n nicht zusätzlich.
        echo(%%k, !DOW!^)%%m
Steffen