docjunior
Goto Top

Substring durch Variableninhalt mit DOS-Script ersetzen

Benötige Hilfe beim Ersetzen eines Kennzeichens "<USERNAME>" innerhalb einer Variablen durch den Inhalt von %USERNAME%

Aaalso erstmal Hallo ;)

Ich habe eine Konfigurationsdatei in der Schlüssel-Wertpaare stehen unter Anderem folgendes:

WORKSPACE=D:\<USERNAME>\workspace

(ursprünglich hatte ich hier %USERNAME% zu stehen, aber das gibt beim Ersetzen nur noch mehr Probleme)


Diese Datei lese ich über folgende Mimik ein:

FOR /F "eol=# tokens=1* delims== " %%a IN (meine.config) DO (  
 REM TODO: Variablen anerkennen
 REM * Setzen der Debug Einstellungen
 REM ************************************************************
 if /I "%%a" == "DEBUG" (  
  REM sorge dafür, dass debug nur im Falle von true definiert ist
  if /I "%%b" == "true" (  
   echo Setze Debugging auf TRUE
   SET DEBUG=true
  )
 ) else (
  IF DEFINED DEBUG echo +  Setze %%a=%%b
  set %%a=%%b
 )
)


Jetzt möchte ich anstelle <USERNAME> den Inhalt der Umgebungsvariablen %USERNAME% setzen. Ich dachte mir ja sowas:

SET WORKSPACE=%WORKSPACE:<USERNAME>=%%USERNAME%% %

das Ergebnis dieser Zeile ist allerdings
D:\\workspacedocjunior

Was mache ich falsch und wie mache ich's richtig?

Content-Key: 132056

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: Biber
Biber 21.12.2009 um 12:00:43 Uhr
Goto Top
Moin DocJunior,

willkommen im Forum.
Was mache ich falsch und wie mache ich's richtig?
Bitte immer nur eine Frage pro Beitrag.. face-wink

Wenn du eine Variable als "Ersetze-durch" angeben willst, dann musst du explizit der cmd.exe signalisieren, dass du erst diese Variable auflösen willst und die andere (%Workspace% erst danach, verzögert (auf neudeutsch. delayed)
Die zuerst aufzulösende Variable wird dann als !var! statt %var% geschrieben.

Dazu dient der Setlocal-Feintuning-Wert "SetLocal EnableDelayedExpansion", den du
  • entweder in die erste Code-Zeile der Batchdatei schreibst "@echo off & Setlocal EnableDelayedExpansion"
  • oder explizit "Setlocal EnableDelayedExpansion" als Zeile vor diese Ersetz-mir-in-der Workspace-Variablen und eine Zeile danach ein "EndLocal"

Demo an CMD-Prompt (das führende ">" nicht eingeben, ist mein Prompt)
>set WORKSPACE=D:\#USERNAME#\workspace

(=11:47:41  D:\temp=)
>echo %workspace:#username#=!username!%
D:\Biber\workspace

Anmerkung I: ich habe den Dummy #username# statt <username> genannt, weil auch die Kleiner/Größer-Zeichen im Batch spezielle Bedeutung haben.
Anmerkung II: Was spicht denn dagegen, direkt in der Ini-Datei " WORKSPACE=D:\%USERNAME%\workspace" zu schreiben? Reicht doch auch...

Grüße
Biber
Mitglied: DocJunioR
DocJunioR 21.12.2009 um 13:06:19 Uhr
Goto Top
Hallo noch einmal!

Das hat schon prima funktioniert. Allerdings eine Kleinigkeit.
Wenn ich vor dem Austausch ein IF DEFINED WORKSPACE ( ) absetze, funktioniert das Ganze nicht mehr. Kann es sein, dass da die Locale verlassen wird?
Mitglied: Biber
Biber 21.12.2009 um 13:39:28 Uhr
Goto Top
Moin DocJunioR,

das kann ich mir zwar nicht vorstellen - aber wenn du nochmal dein jetziges Skript posten würdest (das mit diesem Effekt), dann klären wir das.

Grüße
Biber