chef1568
Goto Top

Wert in Batchdatei mit Batch suchen u. ersetzen

Hallo zusammen,

Ich habe ein Batch-Script das mir unterschiedliche Einstellungen am PC automatisiert durchführt.

Ein Teil davon ist in einer Scriptvorlage *.bat eine Platzhaltervariable durch eine Benutzereingabe zu ersetzen und das individuelle Script an einen bestimmten Ort zu kopieren.


Scriptvorlage:
-> hier soll die Variable {NETZuser} durch eine Benutzereingabe im Basisscript ersetzt werden
@ECHO OFF
CLS

set NETZlaufwerk=B:

if not exist %NETZlaufwerk% goto conn
NET USE %NETZlaufwerk% /delete

:conn
NET USE %NETZlaufwerk% \\192.198.117.100\Ordner /user:<domain>\{NETZuser} /persistent:yes

Basisscript:
@echo off

REM Abfrage User
set /p NETZuser=Bitte Username angeben:

REM User-Batch erzeugen
set filesource=%cd%\source\Scriptvorlage.bat
set filedestination=%cd%\source\Tools\Netzlaufwerke\Scriptvorlage_User.bat

if exist %filedestination% del %filedestination%

for /F "delims=" %%i in (%filesource%) do (  
	set text=%%i
	set text=!text:{NETZuser}=%NETZuser%!
	echo !text! >> %filedestination%
)
Bei der Variante im Basisscript habe ich mehrere Probleme:
1. der letzte Teil funktioniert nur mit einem statischem "Ersatztext" und keiner Variable %NETZuser% wie im aktuellem Beispiel
2. wenn im letzte Teil ein fester Ersatzwert angegeben wird, werden die Zeilenumbrüche aus der Scriptvorlage.bat in der Scriptvorlage_User.bat nicht berücksichtigt

Danke und Viele Grüße

Content-Key: 519496

Url: https://administrator.de/contentid/519496

Printed on: April 19, 2024 at 06:04 o'clock

Member: TK1987
TK1987 Nov 27, 2019 updated at 08:36:19 (UTC)
Goto Top
Zitat von @chef1568:
Bei der Variante im Basisscript habe ich mehrere Probleme:
1. der letzte Teil funktioniert nur mit einem statischem "Ersatztext" und keiner Variable %NETZuser% wie im aktuellem Beispiel
Variablen mit Variablen Werten zu ersetzen, funktioniert innerhalb einer For-Schleife nicht. Um das zu umgehen, müsstest du einen Bereich außerhalb der For-Schleife callen
for /F "delims=" %%i in (%filesource%) do (  
	set text=%%i
	call :Ersetze
	echo !text! >> %filedestination%
	)

goto :EoF
:Ersetze
set text=!text:{NETZuser}=%NETZuser%! 

Allerdings würde ich die For-Schleife hier gänzlich weglassen und die Variable %NETZuser% direkt als Argument an die Scriptvorlage übergeben
%filesource% %NETZuser%
In der Scriptvorlage ist der User dann als erstes übergebenes Argument mit %1 zu erreichen:
@ECHO OFF
CLS

set NETZlaufwerk=B:

if not exist %NETZlaufwerk% goto conn
NET USE %NETZlaufwerk% /delete

:conn
NET USE %NETZlaufwerk% \\192.198.117.100\Ordner /user:<domain>\%1 /persistent:yes
Member: chef1568
chef1568 Nov 27, 2019 at 08:44:47 (UTC)
Goto Top
Hallo TK1984,

danke für deine Variante.

Leider ist die Lösung so nicht umsetzbar.
Ich möchte mit der Benutzereingabe den Platzhalter im eigentlichem Batch-Script ersetzen (replace).
Sonst muss der Benutzer immer wieder die Abfrage befüllen. So macht er diesen Schritt initial und das BatchScript wird dementsprechend geändert dass keine Eingaben mehr erforderlich sind.

VG
Member: TK1987
Solution TK1987 Nov 27, 2019 updated at 09:52:06 (UTC)
Goto Top
Verstehe, dann halt über die Variante mittels call. Was Die Leeren zeilen angeht.. die werden mit for /f nie berücksichtigt, hier müssen wir tricksen, indem wir mit find die Zeilennummern der Datei mit Ausgeben und diese dann über die Tokens der Forschleife wieder wegschneiden.
@echo off
setlocal enabledelayedexpansion

REM Abfrage User
set /p NETZuser=Bitte Username angeben:

REM User-Batch erzeugen
set filesource=%cd%\source\Scriptvorlage.bat
set filedestination=%cd%\source\Tools\Netzlaufwerke\Scriptvorlage_User.bat

if exist %filedestination% del %filedestination%

for /F "skip=2 tokens=1,* delims=]" %%i in ('find /v  /n "" %filesource%') do (  
	if "%%j" equ "" (echo. >> %filedestination%) else (  
		set text=%%j
		call :Ersetze
		echo !text! >> %filedestination%
		)
)

goto :EoF
:Ersetze
set text=!text:{NETZuser}=%NETZuser%!
Member: chef1568
chef1568 Nov 27, 2019 at 15:12:07 (UTC)
Goto Top
Funktioniert perfekt face-smile

Super, Danke!
VG