Probleme mit verzögerter Erweiterung und dem Ersetzen von Variablen

2

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 zu ersetzenden Zeichenfolge sucht.

Mein Problem ist, dass nach dem Ersetzen und Zurückschreiben der Datei auf die Festplatte alle Instanzen !der INI-Datei bereinigt werden, was wiederum mein Programm zerstört.

Ich !vermute, dass die Marken 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 helfen könnte, dies herauszufinden.

Ich habe seit Tagen versucht, 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
    )
)
Pyr3x
quelle

Antworten:

1

Offensichtlich haben Sie die Erweiterung des gesamten bereitgestellten Codes verzögert, und nach der variablen Erweiterung von FOR tritt eine verzögerte Erweiterung auf. Ja, der Wert von %%iist beschädigt, da 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 vorübergehend zu deaktivieren, während sie %%ierweitert wird.

Außerdem ist es nicht erforderlich, die Datei zu TYPEN, und es ist nicht erforderlich, dass das ungerade umgeleitete BREAK eine leere Ausgabedatei erstellt oder die Umleitung innerhalb der Schleife angehängt wird. Sie können einfach FOR / F die Datei direkt 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. Dies ist jedoch 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 nicht, Textdateien im Batch zu bearbeiten. Stattdessen würde ich JREPL.BAT verwenden - ein hybrides JScript / Batch-Dienstprogramm, das ab XP auf jedem Windows-Computer nativ ausgeführt wird :

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

Viel einfacher und schneller und zuverlässiger :-)

dbenham
quelle
Das hat sehr gut geklappt! Vielen Dank! Ich konnte es auf meinen Code anwenden und verstehe genau, warum Sie das getan haben, was Sie getan haben. Zu den Fragen, die sich auf die Verwendung von "break" beziehen, muss ich zugeben, dass ich sie selbst nicht vollständig verstanden habe. Ich hatte die Lösung dafür von einem Freund erhalten, und mein grundlegendes Verständnis davon, nachdem ich viel Zeit damit verbracht habe, besteht darin, dass es die Daten im Speicher bearbeitet und sie dann über die Datei schreibt, aber ich bin es nicht sicher.
Pyr3x,
Dave - Wenn Sie eine Chance haben, nur für den Fall, dass Sie Tipps zum Thema mit dieser Frage "Meine Frage" haben, wollte ich Ihnen einen Link nur für den Fall senden. Das mag nicht viel anderes sein als das, was andere bereits gesagt haben, aber ich dachte mir, wenn jemand zusätzliche hilfreiche Tipps hätte, dann wären Sie es. Mach weiter so, Mann !!
Pimp Juice IT