Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator Biber am 24.05.2009 um 22:57:47 Uhr
Frage verschoben von "Windows" nach "Batch & Shell".

Batch-Templatefile ausfüllen mit Batch-Script

Frage Entwicklung Batch & Shell

Mitglied: Schnulle500

Schnulle500 (Level 1) - Jetzt verbinden

24.05.2009, aktualisiert 25.05.2009, 4872 Aufrufe, 9 Kommentare

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.

01.
:: **************************************************************************** 
02.
:: This batch script copies the template of the build script 
03.
:: to the specified project directory and customizes the copy by applying the 
04.
:: remaining input parameters of this batch script. 
05.
:: **************************************************************************** 
06.
ECHO OFF 
07.
SETLOCAL ENABLEDELAYEDEXPANSION 
08.
 
09.
:: Pares the command line arguments 
10.
:: %1..%x -> Command line arguments 
11.
:: PROJ_DIR<- Path of project directory (unquotet) 
12.
:: TOOL_PATH  - Path of Tool installation directory (unquotet) 
13.
:: COMPILER_PATH - Path of GCC compiler directory (unquotet) 
14.
:: OUTPUT_FILENAME - File name of resulting module 
15.
:: GCC_USERDEFINES - Set of userdefined compiler defines: [-Ddefine_n [-Ddefine_n+1]] 
16.
SET PROJ_DIR=%~1 
17.
SHIFT 
18.
SET TOOL_PATH=%~1 
19.
SHIFT 
20.
SET COMPILER_PATH=%~1 
21.
SHIFT 
22.
SET OUTPUT_FILENAME=%~1 
23.
SET GCC_USERDEFINES= 
24.
:NEXT_CMDLINE_ARG 
25.
SHIFT 
26.
IF NOT [%1]==[] ( 
27.
  SET GCC_USERDEFINES=!GCC_USERDEFINES! -D%1 
28.
  GOTO NEXT_CMDLINE_ARG 
29.
30.
:: Remove the leading space character 
31.
SET GCC_USERDEFINES=%GCC_USERDEFINES:~1% 
32.
 
33.
ECHO PROJ_DIR : %PROJ_DIR% 
34.
ECHO TOOL_PATH : %TOOL_PATH% 
35.
ECHO COMPILER_PATH : %COMPILER_PATH% 
36.
ECHO OUTPUT_FILENAME : %OUTPUT_FILENAME% 
37.
ECHO GCC_USERDEFINES : %GCC_USERDEFINES% 
38.
 
39.
IF EXIST "%PROJ_DIR%\build.bat" ( 
40.
  ECHO Deleting existing build script file 
41.
  DEL "%PROJ_DIR%\build.bat" 
42.
  IF ERRORLEVEL 1 GOTO EXIT_WITH_ERROR  
43.
44.
 
45.
ECHO Customizing build script 
46.
for /F "delims=] tokens=1,*" %%a in ('find /n /v "" build.bat.template') do call :ReplaceText "%%b" "%PROJ_DIR%\build.bat"  
47.
 
48.
GOTO :EOF 
49.
 
50.
:ReplaceText 
51.
  set "TEXT=%~1"  
52.
  if "!TEXT!"=="" (echo.>>%2) && goto :eof  
53.
  set TEXT=!TEXT:$TOOL_PATH$=%TOOL_PATH%!  
54.
  set TEXT=!TEXT:$COMPILER_PATH$=%COMPILER_PATH%!  
55.
  set TEXT=!TEXT:$OUTPUT_FILENAME$=%OUTPUT_FILENAME%!  
56.
  set TEXT=!TEXT:$GCC_USERDEFINES$=%GCC_USERDEFINES%!  
57.
  >>%2 echo !TEXT! 
58.
GOTO :EOF 
59.
 
60.
:EXIT_WITH_ERROR 
61.
ECHO COPYING OR CUSTOMIZING BUILD SCRIPT FAILED. 
62.
EXIT /b 1 
63.
 
Mitglied: bastla
24.05.2009 um 22:38 Uhr
Hallo Schnulle500 und willkommen im Forum!

Zum Thema ":ReplaceText": Mit der folgenden Alternativ-Variante solltest Du auch ohne "delayedExpansion" auskommen können:
01.
:ReplaceText 
02.
  set "TEXT=%~1"   
03.
  if "%TEXT%"=="" (echo.>>%2) && goto :eof   
04.
  call set "TEXT=%%TEXT:$TOOL_PATH$=%TOOL_PATH%%%" 
05.
  call set "TEXT=%%TEXT:$COMPILER_PATH$=%COMPILER_PATH%%%" 
06.
  call set "TEXT=%%TEXT:$OUTPUT_FILENAME$=%OUTPUT_FILENAME%%%" 
07.
  call set "TEXT=%%TEXT:$GCC_USERDEFINES$=%GCC_USERDEFINES%%%" 
08.
  >>%2 echo %TEXT% 
09.
GOTO :EOF
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 ...
Bitte warten ..
Mitglied: LotPings
24.05.2009 um 22:40 Uhr
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
Bitte warten ..
Mitglied: Schnulle500
25.05.2009 um 09:24 Uhr
Hallo,
vielen Dank für die sehr schnell Hilfe. Das hat mich dem Ziel schon sehr viel näher gebracht.
Ist es denn auch möglich, die % durch eine Stringsubstitution automatisch vorab durch %% zu ersetzen? Folgende Anweisung bringt nicht den erwarteten Effekt:
01.
call set "TEXT=%%TEXT:^%=^%^%%%"
Gruß
Schnulle500
Bitte warten ..
Mitglied: Biber
25.05.2009 um 09:46 Uhr
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:

01.
 
02.
(= 9:45:39  D:\temp=) 
03.
>set "testzeile=hier soll so was wie %var% stehen" 
04.
>set testzeile & @echo !testzeile:%=%%! 
05.
testzeile=hier soll so was wie %var% stehen 
06.
hier soll so was wie %%var%% stehen
Grüße
Biber
Bitte warten ..
Mitglied: Schnulle500
25.05.2009 um 10:40 Uhr
Boa, das geht aber schnell hier mit den Antworten.

Ich mußte die DelayedExtensions disabeln, da sonst auch noch die !var! im Batch-Template Probleme machen.

Wie sieht den die Syntax ohne die DelayedExtensions aus?
Folgendes funktioniert nämlich nicht:
01.
set testzeile & @echo %testzeile:%=%%%
Bitte warten ..
Mitglied: LotPings
25.05.2009 um 10:49 Uhr
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.

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:
01.
ECHO Customizing build script 
02.
for /F "delims=] tokens=1,*" %%a in ( 
03.
 'find /n /v "" build.bat.template' 
04.
   ) do set "TEXT=%%b" & call :ReplaceText "%PROJ_DIR%\build.bat"  
05.
 
06.
GOTO :EOF 
07.
 
08.
:ReplaceText 
09.
if "!TEXT!"=="" (echo.>>%1) && goto :eof 
10.
set "TEXT=%TEXT:"=¬%" 
11.
set "TEXT=%TEXT:^=^^%" 
12.
set "TEXT=%TEXT:&=^&%" 
13.
set "TEXT=%TEXT:<=^<%" 
14.
set "TEXT=%TEXT:>=^>%" 
15.
set "TEXT=%TEXT:(=^(%" 
16.
set "TEXT=%TEXT:)=^)%" 
17.
set "TEXT=%TEXT:|=^|%" 
18.
set "TEXT=%TEXT:¬="%" 
19.
 
20.
set TEXT=!TEXT:$TOOL_PATH$=%TOOL_PATH%!  
21.
set TEXT=!TEXT:$COMPILER_PATH$=%COMPILER_PATH%!  
22.
set TEXT=!TEXT:$OUTPUT_FILENAME$=%OUTPUT_FILENAME%!  
23.
set TEXT=!TEXT:$GCC_USERDEFINES$=%GCC_USERDEFINES%!  
24.
>>%1 echo !TEXT! 
25.
GOTO :EOF 
26.
 
27.
:EXIT_WITH_ERROR 
28.
ECHO COPYING OR CUSTOMIZING BUILD SCRIPT FAILED. 
29.
EXIT /b 1
Bitte warten ..
Mitglied: Schnulle500
26.05.2009 um 11:18 Uhr
Also was jetzt prima funktioniert ist:
01.
 
02.
::do.bat "C:\proj" "C:\tool" "C:\compiler" out.o myoem 
03.
 
04.
ECHO OFF 
05.
SETLOCAL DISABLEDELAYEDEXPANSION 
06.
 
07.
SET PROJ_DIR=%~1 
08.
SHIFT 
09.
SET TOOL_PATH=%~1 
10.
SHIFT 
11.
SET COMPILER_PATH=%~1 
12.
SHIFT 
13.
SET OUTPUT_FILENAME=%~1 
14.
SHIFT 
15.
SET TARGET_OEM=%~1 
16.
 
17.
ECHO PROJ_DIR : %PROJ_DIR% 
18.
ECHO TOOL : %TOOL_PATH% 
19.
ECHO COMPILER_PATH : %COMPILER_PATH% 
20.
ECHO OUTPUT_FILENAME : %OUTPUT_FILENAME% 
21.
ECHO TARGET_OEM : %TARGET_OEM% 
22.
 
23.
IF EXIST "%PROJ_DIR%\build.bat" ( 
24.
  ECHO Deleting existing build script file 
25.
  DEL "%PROJ_DIR%\build.bat" 
26.
  IF ERRORLEVEL 1 GOTO EXIT_WITH_ERROR  
27.
28.
 
29.
ECHO Customizing build script 
30.
FOR /F "delims=] tokens=1,*" %%a IN ('FIND /N /V "" build.bat.template') DO ( 
31.
  SET TEXT=%%b 
32.
  CALL :REPLACETEXT "%PROJ_DIR%\build.bat" 
33.
)   
34.
 
35.
GOTO :EOF 
36.
 
37.
:REPLACETEXT 
38.
  if "%TEXT%"=="" (echo.>>%1) && goto :eof   
39.
  call set "TEXT=%%TEXT:$TOOL_PATH$=%TOOL_PATH%%%" 
40.
  call set "TEXT=%%TEXT:$COMPILER_PATH$=%COMPILER_PATH%%%" 
41.
  call set "TEXT=%%TEXT:$OUTPUT_FILENAME$=%OUTPUT_FILENAME%%%" 
42.
  call set "TEXT=%%TEXT:$TARGET_OEM$=%TARGET_OEM%%%" 
43.
  >>%1 ECHO.%TEXT% 
44.
GOTO :EOF 
45.
 
46.
 
47.
:EXIT_WITH_ERROR 
48.
ECHO COPYING OR CUSTOMIZING BUILD SCRIPT FAILED. 
49.
EXIT /b 1
Mit zwei Einschränkungen, die ich nicht begreife:
(1) Folgende Anweisung im Template-Script läßt die Scriptausführung mit Fehler abbrechen:
01.
SET REG_KEY="HKEY_LOCAL_MACHINE^\SOFTWARE^\Cygnus Solutions^\Cygwin^\mounts v2^\/"
(1) FOR /F Schleife im Template-Script läßt die Scriptausführung mit Fehler abbrechen. Die Parameter werden angemäkelt ("token=...")
01.
FOR /F "tokens=3*" %%v in (file.txt) do ..
Bitte warten ..
Mitglied: LotPings
26.05.2009 um 13:13 Uhr
Zitat von Schnulle500:
Mit zwei Einschränkungen, die ich nicht begreife:
(1) Folgende Anweisung im Template-Script läßt die Scriptausführung mit Fehler abbrechen:
01.
> SET REG_KEY="HKEY_LOCAL_MACHINE^\SOFTWARE^\Cygnus 
02.
> Solutions^\Cygwin^\mounts v2^\/" 
03.
> 
Was glaubst du wofür in meiner geposteten Ergänzung die ganzen
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=...")
01.
> FOR /F "tokens=3*" %%v in (file.txt) do .. 
02.
> 
Nimm einfach meine vorgeschlagene Änderung ab Zeile 45 statt deiner Originalzeilen.


Gruß
LotPings
Bitte warten ..
Mitglied: Schnulle500
28.05.2009 um 12:32 Uhr
Sorry, dass ich hier nochmal nachfrage. Aber das Problem tritt schon im Vergliech auf.
if "%TEXT%"==""

Ich hab das mal zusammengefaßt:

Das eingedampfte Batch, welches nachstehende "Template" einließt und auf der Console wieder ausgibt:
01.
ECHO OFF 
02.
SETLOCAL DISABLEDELAYEDEXPANSION 
03.
CLS 
04.
 
05.
FOR /F "delims=] tokens=1,*" %%a IN ('FIND /N /V "" template.bat') DO ( 
06.
  SET TEXT=%%b 
07.
  CALL :REPLACETEXT 
08.
)   
09.
 
10.
GOTO :EOF 
11.
 
12.
:REPLACETEXT 
13.
  if "%TEXT%"=="" (echo.) && goto :EOF 
14.
  call set "TEXT=%%TEXT:$replace$=ersetzt%%"   
15.
  echo.%TEXT% 
16.
GOTO :EOF
Das Template sieht zu Testzwecken folgendermaßen aus und ist für sich auch tadellos so ausführtbar,.d.h. es wird der gewünschte Registry-Wert angezeigt. Ich bekomm nur die eine Zeile nicht durch das obige Ersetzungsscript durch.
01.
::zeile 1 () 
02.
 
03.
SET TEST=!abcd! 
04.
SET TEST2=$replace$ 
05.
 
06.
SET REG_KEY="HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2\/" 
07.
REG QUERY %REG_KEY% /v "native" 
08.
 
09.
::zeile 8
Ausgabe:
01.
 
02.
::zeile 1 () 
03.
 
04.
SET TEST=!abcd! 
05.
SET TEST2=ersetzt 
06.
 
07.
"Solutions\Cygwin\mounts" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Kannst Du mir bitte nochmals einen Tipp geben?
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch Script Editor - Programmvorstellung des Entwicklers (16)

Tipp von wowItsDoge zum Thema Batch & Shell ...

Windows Server
Batch Script bei Start ausführen (3)

Frage von KEFHVDI zum Thema Windows Server ...

Batch & Shell
Batch-Script für Lizenzen (3)

Frage von stoepsu77 zum Thema Batch & Shell ...

Batch & Shell
Batch-Script für die Messung der Netzwerkgeschwindigkeit (10)

Anleitung von Kraemer zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...