.sessl
Goto Top

Batch: Variable Expansion in einer FOR-Schleife

Hallo zusammen,

leider finde ich dazu nicht viel, "vielleicht" könnt Ihr mir helfen.
Da man keine Parameter Variablen der FOR-Schleife kürzen kann, erzeuge ich eine feste Variable und eine zweite, gekürzt auf die Nummer (01,02,03,etc). Es soll ja dynamisch bleiben. Da in For-Schleifen erzeugte Variablen mit !var! weiterverwendet werden müssen, habe ich nun das Problem, wie ich mit einer Variable verfahre, die sich aus zwei Variablen zusammen setzt:

for /f "tokens=1,6 delims= " %%a in (%log%) do (  
	set "var=%%b"  
	set "var_nr=!var:~5,2!  

	if %%b EQU [WERT!var_nr!] (
		set /a "countvar!var_nr!+=1"  
	)

Im %log% steht zum Beispiel: (auf die Token eingeschränkt)
Datum/Uhrzeit WERT01 
Datum/Uhrzeit WERT02

Die Variable !countvar!var_nr!! kann ich so nicht nutzen, da er nur die erste als Variable erkennt.
Ich möchte gerne mit der "dynamischen" Variable weiter arbeiten:
if !countvar!var_nr!! ...


Gibt es einen Trick, wie ich das doch noch bewerkstelligen kann, oder muss ich komplett umdenken und das Script anders aufbauen?

Vielen Dank für Eure Hilfe!

Gruß
Tobias

[edit]Schreibfehler korrigiert[/edit]

Content-ID: 313329

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

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

129813
129813 23.08.2016 aktualisiert um 12:29:38 Uhr
Goto Top
Batch: Variable in Variable

@echo off & setlocal enabledelayedexpansion
set "test1=Hello1"  
set "test2=Hello2"  
set "test3=Hello3"  

for /L %%a in (1 1 3) do (
	set "number=%%a"  
	set "text=test"  
	call :process "!text!" "!number!"   
	echo !result!
)
goto :eof

:process
 set "result=!%~1%~2!"  
goto :eof
Regards
timlg07
timlg07 23.08.2016 um 13:04:58 Uhr
Goto Top
Hi Sessl

Hatte das Problem selbst schon des öfteren und hab trotz einiger Suchen im Internet keine Lösung gefunden.
Wäre cool wenn jmd im Forum hier das wüsste, aber fürchte du musst das anders lösen.
(was gehen würde wäre !countvar%%b!, was dir aber nicht viel bringt.)

Grüße
Tim
Friemler
Friemler 23.08.2016 um 15:55:08 Uhr
Goto Top
Hallo Tobias,

schreibe Zeile 6 folgendermaßen:
call set /a countvar!var_nr!+=1
Der CALL-Befehl zwingt den Batchscript-Interpreter die Zeile zweimal zu parsen. Beim ersten parsing wird der Wert von var_nr ermittelt und in den Kommando-String eingesetzt, beim zweiten parsing wird dann die gewünschte Variable inkrementiert.

Wenn Du diese Technik in einem Batchscript ohne ENABLEDELAYEDEXPANSION anwendest (die Variablen werden dann ganz normal mit %-Zeichen eingefasst), musst Du die %-Zeichen verdoppeln.

Beispiel:
set "x=5"
call set /a countvar%%x%%+=1


Gruß
Friemler
.Sessl
.Sessl 23.08.2016 um 16:40:15 Uhr
Goto Top
Hallo highload,

danke für deine Hilfe.
Eine ähnliche Möglichkeit hatte ich schon gefunden, jedoch steh ich hier wahrscheinlich auf dem Schlauch.

Die Subroutine wird in deinem Schnipsel mittels zwei Variablen aufgerufen, diese habe ich jedoch nicht, da ich in der FOR-Schleife zur Laufzeit eine neue Variable (countvar<xx>) erzeuge und dass mit Hilfe des Inhalts einer anderen Variable (var_nr):
set /a "countvar!var_nr!+=1"  

Mein Problem ist es, dass ich mit dieser Variable zwar weiter arbeiten kann, dann jedoch nur wie folgt:
echo !countvar01!
> Ausgabe z.B. 16 (Anzahl der Einträge aus %log%)
echo !countvar02!
> Ausgabe z.B. 53 (Anzahl der Einträge aus %log%)

Da ich im besten Fall aber mit der "dynamischen" Variable !countvar!!var_nr! weiter arbeiten möchte, fehlt mir der Ansatz wie. Aber wie gesagt, hier steh ich wahrscheinlich auf dem Schlauch ..

Gruß
Tobias
.Sessl
.Sessl 23.08.2016 um 16:46:16 Uhr
Goto Top
Hallo Friemler,

ich habe mir gerade noch mal ein paar Beispiele zum Befehl CALL angeschaut, jedoch finde ich immer nur welche ohne FOR-Schleife, steige jedoch nicht dahinter, wie der Variablen Aufruf in einer FOR-Schleife aussehen sollte.

Danke!

Gruß
Tobias
Biber
Biber 23.08.2016 aktualisiert um 20:27:44 Uhr
Goto Top
Moin .Sessl,

Wenn weder highload noch Friemler innerhalb von 4 Stunden reagieren, dann heisst das übersetzt so viel wie
Ich geb dem jungen Padawan noch mal etwas Zeit, mein Beispiel nachzulesen und zu variieren... der schafft das schon alleine.

Bitte investiere eine halbe Stunde eigene Gehversuche - es ist von dir lösbar.

Sonst meld dich bitte morgen nochmal, wenn es gar nicht klappt.

Grüße
Biber
.Sessl
.Sessl 25.08.2016 um 12:13:56 Uhr
Goto Top
Hallo Biber,

ich bin auch jemand von der Sorte, nicht jedem alles vorzukauen, jedoch ist heute Tag 4, an dem ich an dem Schnipsel sitze.
Mittlerweile habe ich auch für das Variablen-Problem eine Lösung in den Tiefen des Internets gefunden, ohne wäre ich da glaube nicht drauf gekommen .. aber dazu mehr im Kommentar zu den einzelnen Lösungsansätzen.


Gruß
Tobias
.Sessl
.Sessl 25.08.2016 um 12:30:16 Uhr
Goto Top
Hallo Friemler,

nach laaaanger Recherche habe ich endlich ein Beispiel gefunden, welches mir erklärt wie die Variable nachdem Setzen aufgerufen wird, ich glaube selber wäre ich nicht darauf gekommen.

for /f "tokens=1,6,10 delims= " %%a in (%log%) do (   
	set "var=%%b"   
	set "var_nr=!var:~5,2!   
	call set /a "countvar!var_nr!+=1"  

	call echo %%countvar!var_nr!%%
)

Das erste Problem war, dass ich beim ECHO das CALL vergaß, das nächste Problem, dass %%c bereits durch ein Token verwendet wurde, so dass nicht die gewünschte Variable sondern eben %%c ausgegeben wurde. Abhilfe schaffte anstatt mit %%a zu beginnen, z.B. %%f zu nehmen.

Nun bestehen noch zwei weitere Probleme.
1. bei einem CALL ECHO kann ich <> nicht weiter verwenden (Batch-Ausgabe als HTML für E-Mail (<br>), gibt es hierfür doch noch eine Lösung, da dass Ausklammern ^< ^> nicht mehr funktioniert.
2. ich möchte diese Variable in einer IF Abfrage verwenden, jedoch funktioniert dass lt. Doku ebenfalls nicht mit dem Aufruf CALL (sowie FOR und REM)

if %%countvar!var_nr!%% GTR 5 

Das erste Problem bin ich mit einer weiteren Zeile und einem einfachen ECHO umgangen
echo ^<br^> >> %log%

Beim zweiten stockt es wieder ..
Könnte mir jemand sagen, wie man diese Variablen-Art nennt, damit ich gezielter im Netz auf die Suche gehen kann? Ich könnte mir vorstellen, dass es noch weitere Varianten dieser Art gibt.
%%countvar!var_nr!%%

Besten Dank für die Unterstützung!

Gruß
Tobias
.Sessl
.Sessl 25.08.2016 um 12:37:47 Uhr
Goto Top
Hallo highload,

ich hatte mich zuerst an die vorgeschlagene Variante mit der Subroutine gewagt, bin jedoch fast verzweifelt, da mir eben der Ansatz wie die erzeuge Variable aufgerufen werden sollte fehlte. Wie bereits geschrieben, fand ich dann ein ähnliches Beispiel und konnte es dadurch ableiten.

for /f "tokens=1,6,10 delims= " %%f in (%log%) do (  
	call :sub1 %%g
	call echo %%countvar!var_nr!%%
)

:sub1
	set "var=%~1"  
	set "var_nr=%var:~5,2%  
	call set /a "countvar%var_nr%+=1"  
exit /b 0

Nach ein bisschen rumprobieren, fand ich eine Subroutine jedoch etwas überflüssig, da der Code ja auch ohne funktioniert.
Trotzdem vielen Dank für die Hilfe!

Gruß
Tobias