Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Schnulle500

Schnulle500 (Level 1) - Jetzt verbinden

24.05.2009, aktualisiert 25.05.2009, 4909 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 ..
Ähnliche Inhalte
Batch & Shell
Klammersetzung in Windows Batch Script
gelöst Frage von VancouveronaBatch & Shell2 Kommentare

Hallo zusammen, Kann man innerhalb einer IF Klammerung For Do Klammerungen nutzen? Oder fällt Windows dabei auf's Gesicht? Beispiel: ...

Batch & Shell

Batch-Script für die Messung der Netzwerkgeschwindigkeit

Anleitung von KraemerBatch & Shell10 Kommentare

Moin zusammen, ich habe mich gerade eben hingesetzt, und eines meiner Scripte ein wenig zeigbar überarbeitet. Da die eine ...

Batch & Shell

Ping script batch

gelöst Frage von ThePommesBudeBatch & Shell4 Kommentare

Hallo, ich habe hier ein kleines script geschrieben, dass die IP adressen Pingen soll und zurück geben soll, ob ...

Batch & Shell

Batch Script Datensicherung

gelöst Frage von PatrickB90Batch & Shell1 Kommentar

Guten morgen, zur Datensicherung mehrerer Access MDBs wird ein regelmäßiger Task ausgeführt, der die Daten auf einen NAS kopiert. ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 1 TagWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 1 TagAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 2 TagenHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 2 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Hyper-V
Hyper-V mit altem XEON-Server. Was ist falsch?
Frage von LollipopHyper-V11 Kommentare

Hallo Bin etwas frustriert. Kleinbetrieb, ca. 15 PC's, 2 Stk. Server mit einigen virtuellen PC's für Fernwartung, VaultServer für ...

Windows Server
NTFS Berechtigungen Ordnerstruktur
Frage von hukahu23489Windows Server11 Kommentare

Hallo, ich bin seit kurzem in einer neuen IT-Abteilung und bin über das Berechtigungskonzept des Unternehmens sehr schockiert. Ich ...