Probleme mit DelayedExpansion und Variablenersetzung

Probleme mit DelayedExpansion und Variablenersetzung

Ich habe dieses Batch-Skript, das 5 statische Set-Variablen durchblättert, die einen Dateipfad zu einer INIDatei enthalten, die es dann liest und nach einer bestimmten Zeichenfolge zum Ersetzen sucht.

Mein Problem besteht darin, dass if nach den genannten Ersetzungen und dem Zurückschreiben der Datei auf die Festplatte alle Instanzen innerhalb der INI-Datei zu bereinigen scheint, !was wiederum mein Programm beschädigt.

Ich vermute, dass die !Markierungen aufgrund von DelayedExpansion ersetzt werden, aber ich brauche es, um meine Aufgaben hier auszuführen. Ich füge dem Problem eine Kopie der Funktion bei. Ich wäre sehr dankbar, wenn mir jemand dabei helfen könnte, das herauszufinden.

Ich versuche schon seit Tagen, eine Antwort darauf zu finden …

FOR %%A IN (1 2 3 4 5) DO (
    SET CFG_A=!CFG_%%A!
    IF "%DEBUG%"=="1" ECHO !CFG_A!
    FOR /f "delims=" %%i IN ('type "!CFG_A!" ^& break ^> "!CFG_A!" ') DO (
        SET "line=%%i"
        SETLOCAL enabledelayedexpansion
        SET "line=!line:%IP_V%=%IP%!"
        >>"!CFG_A!" echo(!line!
        ENDLOCAL
    )
)

Antwort1

Sie haben offensichtlich im gesamten veröffentlichten Code eine verzögerte Erweiterung, und die verzögerte Erweiterung erfolgt nach der Erweiterung der FOR-Variable. Also ja, der Wert %%iist beschädigt, weil die verzögerte Erweiterung aktiviert ist.

Eine Lösung besteht darin, ein zusätzliches SETLOCAL / ENDLOCAL in Ihre innere Schleife einzufügen, um die verzögerte Erweiterung während %%ider Erweiterung vorübergehend zu deaktivieren.

Außerdem ist es nicht nötig, die Datei zu TYPEN und auch das seltsam umgeleitete BREAK zum Erstellen einer leeren Ausgabedatei oder die anhängende Umleitung innerhalb der Schleife ist nicht erforderlich. Sie können die Datei einfach direkt mit FOR /F lesen lassen und einmal außerhalb der inneren Schleife umleiten. Zugegeben, Sie müssen in eine temporäre neue Datei schreiben und das Ergebnis dann auf den ursprünglichen Namen verschieben. Aber das ist viel effizienter (schneller).

FOR %%A IN (1 2 3 4 5) DO (
  IF "%DEBUG%"=="1" >&2 ECHO(!CFG_%%A!
  (FOR /f "usebackq delims=" %%i IN ("!CFG_%%A!") DO (
    SETLOCAL disableDelayedExpansion
    SET "line=%%i"
    SETLOCAL enableDelayedExpansion
    SET "line=!line:%IP_V%=%IP%!"
    echo(!line!
    ENDLOCAL
    ENDLOCAL
  ))>"!CFG_%%A!.new"
  MOVE /Y "!CFG_%%A!.new" "!CFG_%%A!" >nul
)

Hinweis - Ich mag es wirklich nicht, Textdateien im Stapel zu bearbeiten. Stattdessen würde ich verwendenJREPL.BAT - ein hybrides JScript/Batch-Dienstprogramm, das nativ auf jedem Windows-Computer ab XP läuft:

FOR %%A IN (1 2 3 4 5) DO CALL JREPL "%IP_V%" "%IP%" /L /I /F "!CFG_%%A!" /O -

Viel einfacher, schneller und zuverlässiger :-)

verwandte Informationen