Batch-Templatefile ausfüllen mit Batch-Script
Ich habe ein Template-Batchscript, in welchem ich mittels einem zweiten Batchscript bestimmte mit $Bezeichner$ markierte Stellen ersetzen möchte. Im Template-Batchscript ist die Delayed-Expansion aktiviert. D.h. es sind somit sowohl variablen im Format %var_x% als auch
im Format !var_y! verwendet.
Nachstehendes Script funktioniert schon soweit, daß die Bezeicher ersetzt und Leerzeilen, Leerzeichen und mit Doppelpunkt beginnende Zeilen übernommen werden.
Problem:
(1) %%a Variablen werden zu %a
(2) %var_x% Variablen gehen komplett verloren
(3) !var_y! Variablen gehen komplett verloren
(4) %CD% aus Template wird mit echo in File schon aufgelöst.
Kann mir bitte jemand weiterhelfen?
Ich hab's auch schon mit DISABLEDELAYEDEXPANSION versucht. Sah bzgl. der !var_y! Variablen besser
aus. Jedoch kriegt ich dann die Syntax mit dem Ersetzen der Template-Bezeicher in den set - Statements innerhalb
Subroutine ReplaceText nicht mehr auf die Reihe, da der neue Text aus einer Variable kommt und kein Literal ist.
im Format !var_y! verwendet.
Nachstehendes Script funktioniert schon soweit, daß die Bezeicher ersetzt und Leerzeilen, Leerzeichen und mit Doppelpunkt beginnende Zeilen übernommen werden.
Problem:
(1) %%a Variablen werden zu %a
(2) %var_x% Variablen gehen komplett verloren
(3) !var_y! Variablen gehen komplett verloren
(4) %CD% aus Template wird mit echo in File schon aufgelöst.
Kann mir bitte jemand weiterhelfen?
Ich hab's auch schon mit DISABLEDELAYEDEXPANSION versucht. Sah bzgl. der !var_y! Variablen besser
aus. Jedoch kriegt ich dann die Syntax mit dem Ersetzen der Template-Bezeicher in den set - Statements innerhalb
Subroutine ReplaceText nicht mehr auf die Reihe, da der neue Text aus einer Variable kommt und kein Literal ist.
:: ****************************************************************************
:: This batch script copies the template of the build script
:: to the specified project directory and customizes the copy by applying the
:: remaining input parameters of this batch script.
:: ****************************************************************************
ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:: Pares the command line arguments
:: %1..%x -> Command line arguments
:: PROJ_DIR<- Path of project directory (unquotet)
:: TOOL_PATH - Path of Tool installation directory (unquotet)
:: COMPILER_PATH - Path of GCC compiler directory (unquotet)
:: OUTPUT_FILENAME - File name of resulting module
:: GCC_USERDEFINES - Set of userdefined compiler defines: [-Ddefine_n [-Ddefine_n+1]]
SET PROJ_DIR=%~1
SHIFT
SET TOOL_PATH=%~1
SHIFT
SET COMPILER_PATH=%~1
SHIFT
SET OUTPUT_FILENAME=%~1
SET GCC_USERDEFINES=
:NEXT_CMDLINE_ARG
SHIFT
IF NOT [%1]== (
SET GCC_USERDEFINES=!GCC_USERDEFINES! -D%1
GOTO NEXT_CMDLINE_ARG
)
:: Remove the leading space character
SET GCC_USERDEFINES=%GCC_USERDEFINES:~1%
ECHO PROJ_DIR : %PROJ_DIR%
ECHO TOOL_PATH : %TOOL_PATH%
ECHO COMPILER_PATH : %COMPILER_PATH%
ECHO OUTPUT_FILENAME : %OUTPUT_FILENAME%
ECHO GCC_USERDEFINES : %GCC_USERDEFINES%
IF EXIST "%PROJ_DIR%\build.bat" (
ECHO Deleting existing build script file
DEL "%PROJ_DIR%\build.bat"
IF ERRORLEVEL 1 GOTO EXIT_WITH_ERROR
)
ECHO Customizing build script
for /F "delims=] tokens=1,*" %%a in ('find /n /v "" build.bat.template') do call :ReplaceText "%%b" "%PROJ_DIR%\build.bat"
GOTO :EOF
:ReplaceText
set "TEXT=%~1"
if "!TEXT!"=="" (echo.>>%2) && goto :eof
set TEXT=!TEXT:$TOOL_PATH$=%TOOL_PATH%!
set TEXT=!TEXT:$COMPILER_PATH$=%COMPILER_PATH%!
set TEXT=!TEXT:$OUTPUT_FILENAME$=%OUTPUT_FILENAME%!
set TEXT=!TEXT:$GCC_USERDEFINES$=%GCC_USERDEFINES%!
>>%2 echo !TEXT!
GOTO :EOF
:EXIT_WITH_ERROR
ECHO COPYING OR CUSTOMIZING BUILD SCRIPT FAILED.
EXIT /b 1
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 24.05.2009 um 22:57:47 Uhr
Frage verschoben von "Windows" nach "Batch & Shell".
Content-ID: 116670
Url: https://administrator.de/forum/batch-templatefile-ausfuellen-mit-batch-script-116670.html
Ausgedruckt am: 06.05.2025 um 19:05 Uhr
9 Kommentare
Neuester Kommentar
Hallo Schnulle500 und willkommen im Forum!
Zum Thema ":ReplaceText": Mit der folgenden Alternativ-Variante solltest Du auch ohne "delayedExpansion" auskommen können:
Was "%%a" wird zu "%a" bzw "%cd% wird ausgelöst" anlangt: Jedes verdoppelte %-Zeichen wird im Batch zu einem einfachen reduziert, daher eben zB "%%%%a" oder "%%cd%%" verwenden ...
Grüße
bastla
P.S.: Zu mehr reicht's bei mir heute leider nicht ...
Zum Thema ":ReplaceText": Mit der folgenden Alternativ-Variante solltest Du auch ohne "delayedExpansion" auskommen können:
:ReplaceText
set "TEXT=%~1"
if "%TEXT%"=="" (echo.>>%2) && goto :eof
call set "TEXT=%%TEXT:$TOOL_PATH$=%TOOL_PATH%%%"
call set "TEXT=%%TEXT:$COMPILER_PATH$=%COMPILER_PATH%%%"
call set "TEXT=%%TEXT:$OUTPUT_FILENAME$=%OUTPUT_FILENAME%%%"
call set "TEXT=%%TEXT:$GCC_USERDEFINES$=%GCC_USERDEFINES%%%"
>>%2 echo %TEXT%
GOTO :EOF
Grüße
bastla
P.S.: Zu mehr reicht's bei mir heute leider nicht ...

Hallo Schnulle500,
warum überhaupt die $ Zeichen? Wenn du im Template die $ durch % ersetzt und alle % die den Transport "überleben" sollen verdoppelst (und doppelte vervierfachst) sollte das eigentlich gehen ohne explizierte Ersetzungen.
Gruß
LotPings
warum überhaupt die $ Zeichen? Wenn du im Template die $ durch % ersetzt und alle % die den Transport "überleben" sollen verdoppelst (und doppelte vervierfachst) sollte das eigentlich gehen ohne explizierte Ersetzungen.
Gruß
LotPings
Moin Schnulle500,
ich bin mir relativ sicher, dass wir Deinen Batch auch mit gesetzter "DelayedExpansion" zu Fliegen bringen könnten.
Damit geht es problemlos:
Demo am CMD-Prompt:
Grüße
Biber
ich bin mir relativ sicher, dass wir Deinen Batch auch mit gesetzter "DelayedExpansion" zu Fliegen bringen könnten.
Damit geht es problemlos:
Demo am CMD-Prompt:
(= 9:45:39 D:\temp=)
>set "testzeile=hier soll so was wie %var% stehen"
>set testzeile & @echo !testzeile:%=%%!
testzeile=hier soll so was wie %var% stehen
hier soll so was wie %%var%% stehen
Grüße
Biber

Zitat von @Biber:
ich bin mir relativ sicher, dass wir Deinen Batch auch mit gesetzter "DelayedExpansion" zu Fliegen bringen könnten.
Damit geht es problemlos: Demo am CMD-Prompt:
Moin Biber.ich bin mir relativ sicher, dass wir Deinen Batch auch mit gesetzter "DelayedExpansion" zu Fliegen bringen könnten.
Damit geht es problemlos: Demo am CMD-Prompt:
Das Problem in seinem Bach ist aber das er die eingelesene Zeile per Argument dem Call mitgibt.
Dadurch wird das % aber schon ausgewertet und erscheint in der sub gar nicht erst.
Ausweg ist, es in der for Schleife einer Variable zuzuweisen und diese in der Sub zu referenzieren.
@Schnulle500
Versuche es mal mit dieser geänderten Version Zeilen ab 45 austauschen:
ECHO Customizing build script
for /F "delims=] tokens=1,*" %%a in (
'find /n /v "" build.bat.template'
) do set "TEXT=%%b" & call :ReplaceText "%PROJ_DIR%\build.bat"
GOTO :EOF
:ReplaceText
if "!TEXT!"=="" (echo.>>%1) && goto :eof
set "TEXT=%TEXT:"=¬%"
set "TEXT=%TEXT:^=^^%"
set "TEXT=%TEXT:&=^&%"
set "TEXT=%TEXT:<=^<%"
set "TEXT=%TEXT:>=^>%"
set "TEXT=%TEXT:(=^(%"
set "TEXT=%TEXT:)=^)%"
set "TEXT=%TEXT:|=^|%"
set "TEXT=%TEXT:¬="%"
set TEXT=!TEXT:$TOOL_PATH$=%TOOL_PATH%!
set TEXT=!TEXT:$COMPILER_PATH$=%COMPILER_PATH%!
set TEXT=!TEXT:$OUTPUT_FILENAME$=%OUTPUT_FILENAME%!
set TEXT=!TEXT:$GCC_USERDEFINES$=%GCC_USERDEFINES%!
>>%1 echo !TEXT!
GOTO :EOF
:EXIT_WITH_ERROR
ECHO COPYING OR CUSTOMIZING BUILD SCRIPT FAILED.
EXIT /b 1

(1) Folgende Anweisung im Template-Script läßt die Scriptausführung mit Fehler abbrechen:
Was glaubst du wofür in meiner geposteten Ergänzung die ganzen
Zeilen sind?
Im übrigen ist das in dem Template sowieso Lötzinn, das Backslash ist für die Reg.exe Zeile ein Escape für z. Bsp. das Anführungszeichen, Die einzelnen \ im Pfad brauchen NICHT mit dem Batch Escape versehen werden.
Gruß
LotPings
> SET REG_KEY="HKEY_LOCAL_MACHINE^\SOFTWARE^\Cygnus
> Solutions^\Cygwin^\mounts v2^\/"
>
Set Test=%Test:<=^>%
Zeilen sind?
Im übrigen ist das in dem Template sowieso Lötzinn, das Backslash ist für die Reg.exe Zeile ein Escape für z. Bsp. das Anführungszeichen, Die einzelnen \ im Pfad brauchen NICHT mit dem Batch Escape versehen werden.
(1) FOR /F Schleife im Template-Script läßt die
Scriptausführung mit Fehler abbrechen. Die Parameter werden
angemäkelt ("token=...")
Nimm einfach meine vorgeschlagene Änderung ab Zeile 45 statt deiner Originalzeilen.Scriptausführung mit Fehler abbrechen. Die Parameter werden
angemäkelt ("token=...")
> FOR /F "tokens=3*" %%v in (file.txt) do ..
>
Gruß
LotPings