Dieser Batch Code weist erste Gerät String Variable DeviceVideo
und das zweite Gerät String Variable DeviceAudio
.
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "DeviceCount=0"
for /F "tokens=4,5*" %%A in ('ffmpeg.exe -stats -hide_banner -list_devices true -f dshow -i dummy 2^>^&1') do (
if "%%A %%B" == "Alternative name" (
set /A DeviceCount+=1
if "!DeviceCount!" == "1" (
set "DeviceVideo=%%~C"
) else (
set "DeviceAudio=%%~C"
goto DevicesOutput
)
)
)
:DevicesOutput
set Device
endlocal
ffmpeg
Ausgänge Textnachrichten STDERR statt STDOUT die definitiv typisch nicht für Konsolenanwendungen zu handhaben. Befehl FOR erfasst und verarbeitet nur Text gedruckt auf STDOUT.
Aus diesem Grunde ist es notwendig, alle Ausgabe von ffmpeg
zu umleiten STDERR zu handhaben STDOUT zu handhaben mit 2>&1
als Microsoft Using command redirection operators in TechNet-Artikel erklärt. Es ist notwendig, mit ^
die Operatoren >
und &
zu entkommen, da diese Umleitung bei Ausführung von ffmpeg
und nicht bei Ausführung von FOR angewendet werden soll.
Befehl FüR Prozesse neben den Ausgangsleitungen von ffmpeg
mit Leerzeilen übersprungen und auch mit einem Semikolon Startlinie (default eol
).
Jede Zeile ist in Zeichenfolgen aufgeteilt, wobei Leerzeichen/Tabulatoren als Trennzeichen verwendet werden (Standard delims
). Es wird mit tokens=4,5*
spezifiziert, dass nur die Strings 4, 5 und der Rest der Zeile nach fünftem Leerzeichen/Tabs separater String von Interesse sind und den Loop-Variablen A
, B
und C
zugeordnet werden sollen.
Zum Beispiel die Linie
[dshow @ 02cec400] Alternative name "@device_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
wird auf die Saiten aufgespalten
[dshow
... ignoriert als Token-1 nicht angegeben ist.
@
... ignoriert, da Token 2 nicht angegeben ist.
02cec400]
... ignoriert, da Token 3 nicht angegeben ist.
Alternative
... Token 4 zugewiesen Loop-Variable A
.
name
... Token 5 zugewiesen Loop-Variable B
.
"@device_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
... Token 6 mit *
angegebenen übereinstimmenden Rest der Zeile (mit Leerzeichen und Tabs) zugewiesen Loop-Variable C
.
Innerhalb der Schleife ein Fall empfindlichen String-Vergleich vorgenommen, um zu prüfen, ob Schleifenvariable A
und B
, mit einem einzigen Raum zwischen, in doppelten Anführungszeichen ist der String "Alternative name"
gleich. Die doppelten Anführungszeichen werden nicht durch IF vor dem Vergleich der beiden Zeichenfolgen entfernt.
Bei gleichen Strings wird eine Umgebungsvariable mit einem einfachen arithmetischen Ausdruck um eins erhöht, da in der Ausgabe ein neuer Gerätename gefunden wird.
Der Befehlsinterpreter von Windows ersetzt alle Umgebungsvariable Referenzen mit Syntax %VariableName%
durch den aktuellen Wert jedes referenzierte Umgebungsvariable in einem Befehlsblock mit (
definiert ... )
bereits auf einen solchen Block zu finden. Wenn %DeviceCount%
im Befehlsblock verwendet würde, würde jeder Schleifenlauf mit dem Wert 0 ausgeführt werden, wie in der Zeile über der FOR Schleife definiert. Daher wird die verzögerte Erweiterung verwendet, indem die Syntax !DeviceCount!
verwendet wird und die verzögerte Erweiterung explizit am Anfang des Stapel-Skripts aktiviert wird, da die verzögerte Erweiterung standardmäßig nicht aktiviert ist.
Hinweis: Der Befehl setlocal drückt auch die aktuellen Zustände der Befehlserweiterungen und verzögerte Erweiterungen sowie aktuelles Verzeichnis und ein Zeiger auf Tabelle aktueller Umgebungsvariablen auf dem Stack und erstellt eine Kopie der Tabelle gesamte Umgebungsvariablen für Verwendung bis (übereinstimmend) endlocal oder zum Beenden der Batch-Dateiverarbeitung.
Das Gerät Zeichenfolge ohne die umliegenden doppelten Anführungszeichen wegen %%~C
statt nur ist %%C
entweder oder variable DeviceAudio
Variable DeviceVideo
zugewiesen, je nach Wert der Umgebungsvariablen DeviceCount
.
Da nur die ersten 2 Geräte-Strings von Interesse sind, wird die Schleife bereits nach dem Zuweisen der zweiten Gerätezeichenfolge zu DeviceAudio
beendet.
Alle Variablen mit der Unter Start Device
ausgegeben werden alphabetisch nächste verarbeitete Zeile sortiert auf, die in der Ausgabe für das Beispiel ergibt:
[email protected]_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\Desktop Microphone (3- Studio -
DeviceCount=2
[email protected]_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
schließlich mit dem Befehl endlocal die aktuelle Umgebungsvariablen Tabelle mit DeviceAudio
, DeviceCount
und DeviceVideo
wird aus dem Speicher entfernt, Zustände von Befehlserweiterungen (aktiviert als standardmäßig aktiviert) und verzögerte Erweiterung (deaktiviert als standardmäßig deaktiviert), und das aktuelle Verzeichnis (überhaupt nicht geändert) wird wiederhergestellt, und die anfängliche Umgebungsvariablentabelle wird erstellt wieder aktiv .
Um die verwendeten Befehle noch besser zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie dort die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.
echo /?
endlocal /?
for /?
goto /?
if /?
set /?
setlocal /?
Arbeite wie ein Zauber !! Danke vielmals! Haben Sie einen Vorschlag, wie Sie im Batch-Skript mit einem eingetragenen Markenzeichen umgehen. Microsoft Webcams haben diesen Anmeldenamen und geben mir ein seltsames Symbol. Ich denke, etwas ist mit der Schriftart verwandt, die von der Konsole verwendet wird. – vlad2005
@ vlad2005 Dies ist ein sehr schwieriges Problem, es hängt von Ihren lokalen Einstellungen ab, lesen Sie bitte [hier] (http://stackoverflow.com/a/17177904/2098699). Bitte markieren Sie meine Antwort als akzeptiert, wenn ja. Vielen Dank. – Endoro