Wie kann ich zwei Variablen ineinander verschachteln?
Hallo allerseits!
Könntet Ihr mir wieder einmal einen Tipp für die Batch-Programmierung geben? Vielen Dank für frühere wunderbare Tipps! Ich konnte trotz langer eigener Suche und Probiererei leider keine Lösung finden.
Ich möchte gerne eine Variable zusammensetzen aus einem Wortstamm "usb" und einer Zahl, die ich in einer for-Schleife hochzählen lasse, "count2". Bitte seht Euch das in der folgenden for-Schleife an, in der die Definition der Variable funktioniert. Ich gehe die möglichen Wechsel-Laufwerks-Buchstaben durch, und wenn das dazugehörige Laufwerk von Windows als aktiv erkannt wird, dann wird der Zähler hochgezählt und die Laufvariable aus den Laufwerksbuchstaben mit Kommata zusammengesetzt. Die Ausgabe von "count2" ist z.B. "2", die Ausgabe von "laufvar" "E:, G:".
Später möchte ich gerne die oben erstellte Variablen usb1, usb2, usb3 etc. ausgeben und für eine weitere Bedingung verwenden. Korrekt angezeigt wird beispielsweise, wenn ich folgende Zeile schreibe. Die Ausgabe lautet dann beispielsweise für den folgenden Code korrekt "E:".
Meine Frage: Kann ich auch eine verschachtelte Variable bilden, in der ich die Zahl "1" in der Variable "usb1" mit der Variable "count2" erzeugen lasse? Meine eigenen Versuche sind allerdings gescheitert ...
Vielen Dank fürs Lesen und für jeden Rat!
Mit freundlichen Grüßen,
red-eye
Könntet Ihr mir wieder einmal einen Tipp für die Batch-Programmierung geben? Vielen Dank für frühere wunderbare Tipps! Ich konnte trotz langer eigener Suche und Probiererei leider keine Lösung finden.
Ich möchte gerne eine Variable zusammensetzen aus einem Wortstamm "usb" und einer Zahl, die ich in einer for-Schleife hochzählen lasse, "count2". Bitte seht Euch das in der folgenden for-Schleife an, in der die Definition der Variable funktioniert. Ich gehe die möglichen Wechsel-Laufwerks-Buchstaben durch, und wenn das dazugehörige Laufwerk von Windows als aktiv erkannt wird, dann wird der Zähler hochgezählt und die Laufvariable aus den Laufwerksbuchstaben mit Kommata zusammengesetzt. Die Ausgabe von "count2" ist z.B. "2", die Ausgabe von "laufvar" "E:, G:".
@ echo off
setlocal enabledelayedexpansion
for %%v in (E F G H I J) do (
vol %%v: >nul 2>nul&& set usbdrv%%v=%%v:
if not "!usbdrv%%v!"=="" (
if not "!laufvar2!"=="" (
set /a count2=!count2!+1&& set laufvar2=!laufvar2!, %%v:&& set usb!count2!=!usbdrv%%v!
) else (
set /a count2=!count2!+1&& set laufvar2=%%v:&& set usb!count2!=!usbdrv%%v!
)
) else (
if not "!laufvary!"=="" (
set /a county=!county!+1&& set laufvary=!laufvary!, %%v:
) else (
set /a county=!county!+1&& set laufvary=%%v:
)
)
)
Später möchte ich gerne die oben erstellte Variablen usb1, usb2, usb3 etc. ausgeben und für eine weitere Bedingung verwenden. Korrekt angezeigt wird beispielsweise, wenn ich folgende Zeile schreibe. Die Ausgabe lautet dann beispielsweise für den folgenden Code korrekt "E:".
echo %usb1%
Meine Frage: Kann ich auch eine verschachtelte Variable bilden, in der ich die Zahl "1" in der Variable "usb1" mit der Variable "count2" erzeugen lasse? Meine eigenen Versuche sind allerdings gescheitert ...
echo %usb%count2%%
%usb!count2!%
und andere ...
Vielen Dank fürs Lesen und für jeden Rat!
Mit freundlichen Grüßen,
red-eye
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 252334
Url: https://administrator.de/contentid/252334
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo red-eye,
Variablen, die (innerhalb einer Subumgebung mit verzögerter Variablenerweiterung) in Ausrufezeichen stehen, werden erst bei der Ausführung der Kommandozeile zum Wert aufgelöst. "Normale" Umgebungsvariablen, die in Prozentzeichen eingeschlossen sind, werden immer bereits beim Parsen der Kommandozeile durch ihren Wert ersetzt. Da in deinem Fall count2 zuerst zur Zahl aufgelöst werden muss, um anschließend auf den Wert von usb1 zugreifen zu können, muss die innere Variable in Prozentzeichen stehen und die äußere in Ausrufezeichen.
Eine andere Möglichkeit ist mit CALL zu arbeiten, wobei die äußere Variable in verdoppelten Prozentzeichen seht. Z.B.
Dabei wird beim Parsen die Innere Variable zum Wert aufgelöst und die verdoppelten Prozentzeichen zu einem reduziert. Das CALL sorgt für die Expansion der neu entstandenen Variablen.
Eine dritte Möglichkeit wird eventuell benötigt um innerhalb eines (in Klammern eingefassten) Blocks von Kommandozeilen zu arbeiten, wenn beide Variablen dort verändert werden. Dann kann man sich einem Trick bedienen, der die innere Variable zunächst in eine FOR Variable packt. Z.B.
Alles in Allem solltest du wenn möglich solche assoziativen Arrays wie du sie hier aufbaust ganz vermeiden und gleich aus deinem bisherigen Code heraus mit den Werten weiter arbeiten. Ggf. auch durch den Aufruf einer Subroutine.
Grüße
rubberman
Variablen, die (innerhalb einer Subumgebung mit verzögerter Variablenerweiterung) in Ausrufezeichen stehen, werden erst bei der Ausführung der Kommandozeile zum Wert aufgelöst. "Normale" Umgebungsvariablen, die in Prozentzeichen eingeschlossen sind, werden immer bereits beim Parsen der Kommandozeile durch ihren Wert ersetzt. Da in deinem Fall count2 zuerst zur Zahl aufgelöst werden muss, um anschließend auf den Wert von usb1 zugreifen zu können, muss die innere Variable in Prozentzeichen stehen und die äußere in Ausrufezeichen.
!usb%count2%!
Eine andere Möglichkeit ist mit CALL zu arbeiten, wobei die äußere Variable in verdoppelten Prozentzeichen seht. Z.B.
CALL ECHO %%usb%count2%%%
Eine dritte Möglichkeit wird eventuell benötigt um innerhalb eines (in Klammern eingefassten) Blocks von Kommandozeilen zu arbeiten, wenn beide Variablen dort verändert werden. Dann kann man sich einem Trick bedienen, der die innere Variable zunächst in eine FOR Variable packt. Z.B.
FOR %%i in ("!count2!") DO ECHO !usb%%~i!
Alles in Allem solltest du wenn möglich solche assoziativen Arrays wie du sie hier aufbaust ganz vermeiden und gleich aus deinem bisherigen Code heraus mit den Werten weiter arbeiten. Ggf. auch durch den Aufruf einer Subroutine.
Grüße
rubberman
Hallo red-eye.
Grüße
rubberman
- Muss ich eigentlich deen Befehl "setlocal enabledelayedexpansion" zurücksetzen, und wenn ja, wie?
Du musst nicht, aber manchmal ist es sinnvoll. Mit einem endlocal
beendest du die Subumgebung, ansonsten wird beim Beenden des Batchprozesses implizit ein endlocal
für jedes setlocal
aufgerufen. Sinnvoll ist ein explizites endlocal
immer dann, wenn du in einer Schleife viele setlocal
-Aufrufe hast, da diese sich nicht endlos tief verschachteln lassen. Das setlocal enabledelayedexpansion
hat zudem den Nachteil dass Ausrufezeichen eine Sonderbedeutung bekommen. Insbesondere bei Ausrufezeichen in Zeichenfolgen führt das zu Fehlern. Faustregel: Die Zuweisung von Variablen ist sicher bei ausgeschalteter verzögerter Variablenerweiterung, das Arbeiten mit der Variablen ist sicher mit eingeschalteter verzögerter Variablenerweiterung.- @rubberman, könntest Du mir mit der erforderlichen Nachsicht erklären, wo ich einen assoziativen Array aufbaue ...
Batch kennt grundsätzlich keinen Array-Datentyp, es gibt nur einzelne Umgebungsvariablen. Man kann aber auch mit Einzelvariablen eine Form von Array darstellen. Man benötigt aber irgend etwas mit dem man die Einzelvariablen in einen gemeinsamen Zusammenhang bringen (assoziieren) kann. In deinem Fall ist das der Anfang des Variablennamens usb
. Diesen erweiterst du jeweils durch einen Index und erhältst eine neue Variable.... und warum das nachteilig ist?
Je mehr Umgebungsvariablen du definierst, um so länger dauert die Suche nach der richtigen im Prozess. Im allgemeinen kann man das Vermeiden. Ich habe aber keine Ahnung was du mit den Variablen anstellen willst, darum kann ich dir an der Stelle nicht sagen ob/wie du ggf. ohne das assoziative Array auskommst.Soll ich bereits jetzt die Frage als gelöst markieren, oder schaut Ihr dann nicht mehr rein?
Wenn hier was passiert, bekomme ich eine Mail. Ansonsten ist das natürlich deine Entscheidung, ob das Thema für dich gelöst ist oder noch Fragen bestehen.Grüße
rubberman
Hallo red-eye.
Das Script fällt bei mir in die Rubrik tl;dr weil ich es nicht benötige (also keine Wertung ).
Beim Überfliegen:
Grüße
rubberman
Das Script fällt bei mir in die Rubrik tl;dr weil ich es nicht benötige (also keine Wertung ).
Beim Überfliegen:
:: USB-Stick mit zwei Methoden erkennen – beide sind unzuverlässig, wenn USB-Sticks eingesteckt und entfernt wurden
Teste mal folgenden Dreizeiler gegen deine Methoden:@echo off &setlocal
for /f tokens^=2^ delims^=^" %%i in (
'WMIC DISKDRIVE Where "InterfaceType='USB'" Assoc /assocclass:Win32_DiskDriveToDiskPartition 2^>nul ^|findstr /c:"Disk #"'
) do for /f tokens^=4^ delims^=^" %%j in ('WMIC Path Win32_LogicalDiskToPartition 2^>nul ^|findstr /c:"%%i"') do echo %%j
pause
rubberman