Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Wie kann ich zwei Variablen ineinander verschachteln?

Frage Entwicklung Batch & Shell

Mitglied: red-eye

red-eye (Level 1) - Jetzt verbinden

18.10.2014, aktualisiert 22:19 Uhr, 1585 Aufrufe, 9 Kommentare

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:".

01.
@ echo off 
02.
setlocal enabledelayedexpansion 
03.
for %%v in (E F G H I J) do ( 
04.
  vol %%v: >nul 2>nul&& set usbdrv%%v=%%v: 
05.
  if not "!usbdrv%%v!"=="" ( 
06.
    if not "!laufvar2!"=="" ( 
07.
      set /a count2=!count2!+1&& set laufvar2=!laufvar2!, %%v:&& set usb!count2!=!usbdrv%%v! 
08.
      ) else ( 
09.
      set /a count2=!count2!+1&& set laufvar2=%%v:&& set usb!count2!=!usbdrv%%v! 
10.
11.
    ) else ( 
12.
    if not "!laufvary!"=="" ( 
13.
      set /a county=!county!+1&& set laufvary=!laufvary!, %%v: 
14.
    ) else ( 
15.
      set /a county=!county!+1&& set laufvary=%%v: 
16.
17.
18.
  )
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:".

01.
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 ...

01.
echo %usb%count2%% 
02.
%usb!count2!% 
03.
und andere ...
Vielen Dank fürs Lesen und für jeden Rat!
Mit freundlichen Grüßen,
red-eye
Mitglied: schmitzi
LÖSUNG 18.10.2014, aktualisiert um 22:19 Uhr
Hi,

check mal ECHO !usb%count2%!

Gruss RS
Bitte warten ..
Mitglied: rubberman
LÖSUNG 18.10.2014, aktualisiert um 22:19 Uhr
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.
!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%%%
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.
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
Bitte warten ..
Mitglied: red-eye
18.10.2014 um 21:21 Uhr
Hallo schmitzi und rubberman,

herzlichen Dank für Eure hilfreichen Antworten!

Die von Euch aufgezeigten Lösungsmöglichkeiten funktionieren wunderbar!

Darf ich noch eine "Anschlussfrage" stellen?
- Muss ich eigentlich deen Befehl "setlocal enabledelayedexpansion" zurücksetzen, und wenn ja, wie?
- @rubberman, könntest Du mir mit der erforderlichen Nachsicht erklären, wo ich einen assoziativen Array aufbaue, und warum das nachteilig ist?

Soll ich bereits jetzt die Frage als gelöst markieren, oder schaut Ihr dann nicht mehr rein? ;)

Nochmals vielen Dank!
LG,
der übernächtigte red-eye
Bitte warten ..
Mitglied: rubberman
LÖSUNG 18.10.2014, aktualisiert um 22:19 Uhr
Hallo red-eye.

- 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
Bitte warten ..
Mitglied: red-eye
18.10.2014, aktualisiert um 22:17 Uhr
Hi rubberman,

vielen Dank für Deine erneute Antwort und die hilfreichen und verständlichen Erklärungen.

Ich bin nur ein "Hobbygärtner", deshalb gestalte ich Programmschritte so, wie ich mir den Ablauf der erforderlichen Aktionen vorstelle, und nicht, wie sie am besten programmiert wären.

Ich finde Deine Erklärung sehr wichtig für mein Verständnis für eine sinnvolle Arbeit und werde versuchen, Deine Empfehlungen umzusetzen.

Das Thema ist jetzt für mich gelöst - wie bisher immer in diesem Forum effektiv und freundlich! Vielen Dank!

Beste Grüße,
red-eye
Bitte warten ..
Mitglied: red-eye
19.10.2014 um 18:24 Uhr
To whoom it may concern:

Ich veröffentliche an dieser Stelle den Code der Synchronisations-Batch. Ich möchte damit nicht angeben, und es ist sicher auch kein Meisterwerk geworden. Nur als Rückmeldung für die freundlichen Helfer, was ich mit ihrer Unterstützung mittels Batch-Programmierung erstellt habe.

Ich hoffe, dass meine Admins nicht hier mitlesen. ;) Sie haben unsere Computer sehr weitgehend abgesichert, aber die Batch-Programmierung ausdrücklich erlaubt. Also habe ich mir eine kleine Synchronisations-Routine in einer Batch auf der Basis von Robocopy gebastelt, mit der ich meine eigenen Dateien in mehreren Bereichen ganz flott in Übereinstimmung halten und sichern kann.

Nochmals vielen Dank an die Unterstützer im Forum!
Viele Grüße, red-eye

01.
@ echo off 
02.
 
03.
:: ---------- Synchronisations-Parameter ---------- 
04.
:: Variablen definieren und leeren 
05.
set a=& set b=& set c=& set d=& set e=& set f=& set g=& set h=& set i=& set j=& set k=& set l=& set m=& set n=& set o=& set p= 
06.
set q=& set r=& set s=& set t=& set u=& set v=& set w=& set x=& set y=& set z= 
07.
set hddrive=& set netdrive=&set usbdrive=& set oneuser=& set onepath=& set twouser=& set twopath=& set netpath=& set usbpath= 
08.
set cr=& set f1=& set f2=& set onefull=& set twofull=& set netfull=& set usbfull=& set erhalten=& set source=& set destin= 
09.
set count1=& set count2=& set countx=& set county=& set laufvar1=& set laufvar2=& set laufvarx=& set laufvary= 
10.
 
11.
:: Bekannte Laufwerke festlegen 
12.
set hddrive=C: 
13.
set netdrive=U: 
14.
 
15.
:: Bekannte Pfade festlegen, Schritt für Schritt 
16.
set oneuser=\Users\RED-EYE 
17.
set onepath=\Documents\Eigene Dateien\SYNCHRONISATIONSVERZEICHNIS 
18.
set twouser=\Users\RED-EYE 
19.
set twopath=\Documents\RED-EYE\02\SYNCHRONISATIONSVERZEICHNIS 
20.
set netpath=\Eigene Dateien\SYNCHRONISATIONSVERZEICHNIS 
21.
set usbpath=\Eigene Dateien\SYNCHRONISATIONSVERZEICHNIS 
22.
 
23.
:: ---------- Programmdarstellung ---------- 
24.
:: Codepage für Copyright-Zeichen, die &&’s ohne Leerzeichen und die Zeilenenden sind genau so notwendig 
25.
for /f "tokens=2 delims=:." %%n in ('chcp') do set codepg=%%n&& chcp 1250 
26.
set cr=©&& chcp %codepg% 
27.
title Synchronity %cr%2014 RED-EYE 
28.
 
29.
:: Startbildschirm mit Farbe und neuem Bildschirm, alles nur für die Optik 
30.
color 1f&& cls&& echo. 
31.
echo S y n c h r o n i t y 
32.
echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo. 
33.
echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo. 
34.
timeout /t 5 
35.
 
36.
:: Kurzanleitung, Synchronity ist Synchronicity 2 
37.
color f1&& cls&& echo. 
38.
echo Synchronisation der Speicherorte fr "Synchronisation" mit Robocopy 
39.
echo. 
40.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke 
41.
echo. 
42.
echo 2. šberprfung und Durchsicht der zu synchronisierenden Verzeichnisse 
43.
echo   - "Neuer" ist eine Datei, die im Quellverzeichnis aktueller ist 
44.
echo   - "Neue Datei" liegt nur im Quell-, und nicht im Zielverzeichnis vor 
45.
echo   - "*EXTRA Datei" existiert im *Ziel-, aber nicht im Quellverzeichnis 
46.
echo. 
47.
echo 3. Auswahl: "*Extra Datei" im Zielverzeichnis erhalten oder l”schen 
48.
echo. 
49.
echo 4. Synchronisation starten, oder abbrechen (mit Sicherheitsabfrage) 
50.
timeout /t 5 
51.
 
52.
:: ---------- Laufwerke erkennen, definieren, abfragen ---------- 
53.
:: Alle aktiven Laufwerke erkennen, zuvor noch mit "setlocal" Variablen erst innerhalb for-Schleife berechnen lassen und Variablen zurücksetzen 
54.
:: Die Befehlsverknüpfung von vol mit && (=nur nach erfolgreichem ersten Befehl den zweiten ausführen) ohne Leerzeichen ist genau so notwendig 
55.
setlocal enabledelayedexpansion 
56.
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4) do (set usbdrv%%x=) 
57.
for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do ( 
58.
  vol %%a: >nul 2>nul&& set usbdrv%%a=%%a: 
59.
  if not "!usbdrv%%a!"=="" ( 
60.
    if not "!laufvar1!"=="" ( 
61.
      set /a count1=!count1!+1&& set laufvar1=!laufvar1!, %%a: 
62.
      ) else ( 
63.
      set /a count1=!count1!+1&& set laufvar1=%%a: 
64.
65.
    ) else ( 
66.
    if not "!laufvarx!"=="" ( 
67.
      set /a countx=!countx!+1&& set laufvarx=!laufvarx!, %%a: 
68.
    ) else ( 
69.
      set /a countx=!countx!+1&& set laufvarx=%%a: 
70.
71.
72.
73.
 
74.
:: Aktive Wechsel-Laufwerke erkennen (logisch vermutlich E bis J), vorher Variablen zurücksetzen 
75.
for %%y in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4) do (set usbdrv%%y=) 
76.
for %%b in (E F G H I J) do ( 
77.
  vol %%b: >nul 2>nul&& set usbdrv%%b=%%b: 
78.
  if not "!usbdrv%%b!"=="" ( 
79.
    if not "!laufvar2!"=="" ( 
80.
      set /a count2=!count2!+1&& set laufvar2=!laufvar2!, %%b: 
81.
      ) else ( 
82.
      set /a count2=!count2!+1&& set laufvar2=%%b: 
83.
84.
    ) else ( 
85.
    if not "!laufvary!"=="" ( 
86.
      set /a county=!county!+1&& set laufvary=!laufvary!, %%b: 
87.
    ) else ( 
88.
      set /a county=!county!+1&& set laufvary=%%b: 
89.
90.
91.
92.
 
93.
:: Aktive Laufwerke und Wechsel-Laufwerke ausgeben und Entscheidungen festlegen 
94.
if "%count1%" LEQ "1" (set d=ist) else (set d=sind) 
95.
if "%count1%" GEQ "1" set e=Laufwerk& if "%count2%" GEQ "1" set f1=und& if "%count2%" GEQ "1" set f2=Wechsel-Laufwerk 
96.
if "%count1%" GEQ "2" set g=e& if "%count2%" GEQ "2" set h=e 
97.
if not "%laufvar1%"=="" set i=(%laufvar1%)& if not "%laufvar2%"=="" set j=(%laufvar2%) 
98.
echo.&& echo Es %d% %count1% %e%%g% %i% %f1% %count2% %f2%%h% %j% aktiv. 
99.
 
100.
if "%count2%" LEQ "1" goto usbfest 
101.
if "%count2%" GEQ "2" goto wahlstck 
102.
 
103.
:: USB-Stick mit zwei Methoden erkennen – beide sind unzuverlässig, wenn USB-Sticks eingesteckt und entfernt wurden 
104.
:: Die erste liefert "", wenn keiner, korrektes Laufwerk, wenn einer, und irgendein Laufwerk, wenn mehrere USB-Sticks 
105.
:: Die zweite liefert E:, wenn keiner, korrektes Laufwerk, wenn einer, und erstes, wenn mehrere USB-Sticks vorhanden 
106.
:usbfest 
107.
for /f "tokens=2delims==\" %%v in ('wmic volume where "drivetype=2" get name /format:list^|find "="') do vol %%v >nul 2>nul && set usbdriv1=%%v 
108.
vol J: >nul 2>nul& set usbdriv2=J:& vol I: >nul 2>nul& set usbdriv2=I:& vol H: >nul 2>nul& set usbdriv2=H:& vol G: >nul 2>nul& set usbdriv2=G:& vol F: >nul 2>nul& set usbdriv2=F:& vol E: >nul 2>nul& set usbdriv2=E: 
109.
 
110.
:: Erkennen, ob kein, oder ein oder mehrere USB-Sticks angeschlossen sind 
111.
:: Achtung, die Bedingung des obersten if darf nicht in einem Unter-if erneut formuliert werden! 
112.
if "%usbdriv1%"=="%usbdriv2%" ( 
113.
  if "%usbdriv1%"=="" ( 
114.
    echo.&& echo USB-Laufwerk-Suche ergab logischen Fehler, gehe zu Fehler.&& goto fehler 
115.
    ) else ( 
116.
      echo.&& echo Ein USB-Laufwerk wurde korrekt gefunden, es geht weiter ...&& goto usbfest2 
117.
118.
  ) else ( 
119.
    if "%usbdriv1%"=="" ( 
120.
      echo.&& echo Kein USB-Laufwerk vorhanden, beende daher Synchronity.&& goto abbruch 
121.
      ) else ( 
122.
        echo.&& echo Mehr als ein USB-Laufwerk, oder unzuverl„ssige Erkennung, gehe zur Auswahl.&& goto wahlstck 
123.
124.
125.
 
126.
:: USB-Laufwerk wurde erkannt und wird nun festgelegt 
127.
:usbfest2 
128.
if "%usbdriv1%"=="%usbdriv2%" (set usbdrive=%usbdriv1%) else (set usbdrive=X:) 
129.
goto gehtweit 
130.
 
131.
:: USB-Stick mit choice manuell auswählen 
132.
:wahlstck 
133.
echo. 
134.
:: echo Auswahl des fr die Synchronisation gewnschten USB-Laufwerks, 
135.
:: echo Folgende Auswahl kann demnach getroffen werden: 
136.
:: for %%e in (E F G H I J) do (if not "!usbdrv%%e!"=="" echo !usbdrv%%e!) 
137.
choice /c EFGHIJX /t 90 /d X /m "W„hlen Sie das gewnschte USB-Laufwerk, oder Abbruch mit X: " 
138.
if errorlevel 255 goto fehler 
139.
if errorlevel 7 goto abbruch 
140.
if errorlevel 6 goto sx_6 
141.
if errorlevel 5 goto sx_5 
142.
if errorlevel 4 goto sx_4 
143.
if errorlevel 3 goto sx_3 
144.
if errorlevel 2 goto sx_2 
145.
if errorlevel 1 goto sx_1 
146.
if errorlevel 0 goto goto fehler 
147.
goto fehler 
148.
 
149.
:sx_1 
150.
set usbdrive=E: 
151.
goto gehtweit 
152.
:sx_2 
153.
set usbdrive=F: 
154.
goto gehtweit 
155.
:sx_3 
156.
set usbdrive=G: 
157.
goto gehtweit 
158.
:sx_4 
159.
set usbdrive=H: 
160.
goto gehtweit 
161.
:sx_5 
162.
set usbdrive=I: 
163.
goto gehtweit 
164.
:sx_6 
165.
set usbdrive=J: 
166.
goto gehtweit 
167.
 
168.
:: Pfade zusammensetzen 
169.
:gehtweit 
170.
set onefull=%hddrive%%oneuser%%onepath% 
171.
set twofull=%hddrive%%twouser%%twopath% 
172.
set netfull=%netdrive%%netpath% 
173.
set usbfull=%usbdrive%%usbpath% 
174.
 
175.
:: USB-Pfad für Synchronisationsverzeichnis anlegen, falls nicht vorhanden  
176.
:: Achtung, die Bedingung des obersten if darf nicht in einem Unter-if erneut formuliert werden! 
177.
if not "%usbdrive%"=="X:" ( 
178.
    if exist "%usbfull%" ( 
179.
        echo.&& echo USB-Laufwerk gefunden, USB-Verzeichnis vorhanden, alles ok, weiter ...&& goto weiterso 
180.
    ) else ( 
181.
        echo.&& echo USB-Laufwerk gefunden, USB-Verzeichnis nicht vorhanden, wird erstellt.&& md "%usbfull%"&& goto weiterso 
182.
183.
) else ( 
184.
    if exist "%usbfull%" ( 
185.
        echo.&& echo Kein USB-Laufwerk gefunden, dennoch USB-Verzeichnis vorhanden, logischer Fehler.&& goto fehler 
186.
    ) else ( 
187.
        echo.&& echo Kein USB-Laufwerk, kein USB-Verzeichnis, plausibel, beende Synchronity.&& goto weiterso 
188.
189.
190.
 
191.
:: Überprüfung der Verzeichnisse (Anführungszeichen wegen Leerzeichen notwendig!) 
192.
:weiterso 
193.
if exist "%onefull%" (set p=j) else (set p=n) 
194.
if exist "%twofull%" (set q=j) else (set q=n) 
195.
if exist "%netfull%" (set s=j) else (set s=n) 
196.
if exist "%usbfull%" (set t=j) else (set t=n) 
197.
 
198.
:: Sinnvolle und häufige Kombinationen 
199.
if %p%%q%%s%%t%==jnjj goto anu 
200.
if %p%%q%%s%%t%==jnjn goto an 
201.
if %p%%q%%s%%t%==jnnj got au 
202.
if %p%%q%%s%%t%==njnj goto du 
203.
 
204.
:: Fehler-Kombinationen 
205.
if %p%%q%%s%%t%==jnnn goto anostick 
206.
if %p%%q%%s%%t%==njnn goto dnostick 
207.
if %p%%q%%s%%t%==nnjn goto nnoadu 
208.
if %p%%q%%s%%t%==nnnj goto unoadn 
209.
if %p%%q%%s%%t%==jjjj goto adnuno 
210.
if %p%%q%%s%%t%==nnnn goto noadnu 
211.
 
212.
:: ---------- Abfragen zur Auswahl der Laufwerke ---------- 
213.
:: One-Notebook mit U-Netzlaufwerk und USB-Stick 
214.
:anu 
215.
echo. 
216.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke 
217.
echo. 
218.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt:  
219.
echo One-Notebook %hddrive%, Netzlaufwerk %netdrive% und USB-Stick %usbdrive% 
220.
echo. 
221.
echo Folgende Aktionen sind demnach durchfhrbar:  
222.
echo 1. Synchronisieren von One-Notebook %hddrive% nach Netzlaufwerk %netdrive% 
223.
echo 2. Umgekehrt, von Netzlaufwerk %netdrive% nach One-Notebook %hddrive% 
224.
echo 3. Synchronisieren von One-Notebook %hddrive% nach USB-Stick %usbdrive% 
225.
echo 4. Umgekehrt, von USB-Stick %usbdrive% nach One-Notebook %hddrive% 
226.
echo 5. Synchronisieren von Netzlaufwerk %netdrive% nach USB-Stick %usbdrive% 
227.
echo 6. Umgekehrt, von USB-Stick  %usbdrive% nach Netzlaufwerk %netdrive% 
228.
echo 7. Abbrechen 
229.
echo. 
230.
choice /c 1234567 /t 90 /d 7 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: " 
231.
if errorlevel 255 goto fehler 
232.
if errorlevel 7 goto abbruch 
233.
if errorlevel 6 goto s1_u_n 
234.
if errorlevel 5 goto s1_n_u 
235.
if errorlevel 4 goto s1_u_a 
236.
if errorlevel 3 goto s1_a_u 
237.
if errorlevel 2 goto s1_n_a 
238.
if errorlevel 1 goto s1_a_n 
239.
if errorlevel 0 goto goto fehler 
240.
goto fehler 
241.
 
242.
:s1_a_n 
243.
set source=%onefull%&& set destin=%netfull% 
244.
goto robo_lst 
245.
:s1_n_a 
246.
set source=%netfull%&& set destin=%onefull% 
247.
goto robo_lst 
248.
:s1_a_u 
249.
set source=%onefull%&& set destin=%usbfull% 
250.
goto robo_lst 
251.
:s1_u_a 
252.
set source=%usbfull%&& set destin=%onefull% 
253.
goto robo_lst 
254.
:s1_n_u 
255.
set source=%netfull%&& set destin=%usbfull% 
256.
goto robo_lst 
257.
:s1_u_n 
258.
set source=%usbfull%&& set destin=%netfull% 
259.
goto robo_lst 
260.
 
261.
:an 
262.
echo. 
263.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke 
264.
echo. 
265.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt:  
266.
echo One-Notebook %hddrive% und Netzlaufwerk %netdrive% 
267.
echo. 
268.
echo Folgende Aktionen sind demnach durchfhrbar:  
269.
echo 1. Synchronisieren von One nach Netzlaufwerk 
270.
echo 2. Umgekehrt, von Netzlaufwerk nach One 
271.
echo 3. Abbrechen 
272.
echo. 
273.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: " 
274.
if errorlevel 255 goto fehler 
275.
if errorlevel 3 goto abbruch 
276.
if errorlevel 2 goto s2_n_a 
277.
if errorlevel 1 goto s2_a_n 
278.
if errorlevel 0 goto goto fehler 
279.
goto fehler 
280.
 
281.
:s2_a_n 
282.
set source=%onefull%&&set destin=%netfull% 
283.
goto robo_lst 
284.
:s2_n_a 
285.
set source=%netfull%&&set destin=%onefull% 
286.
goto robo_lst 
287.
 
288.
:au 
289.
echo. 
290.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke 
291.
echo. 
292.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt: 
293.
echo One-Notebook %hddrive% und USB-Stick %usbdrive% 
294.
echo. 
295.
echo Folgende Aktionen sind demnach durchfhrbar: 
296.
echo 1. Synchronisieren von One-Notebook nach USB-Stick 
297.
echo 2. Umgekehrt, von USB-Stick nach One-Notebook 
298.
echo 3. Abbrechen 
299.
echo. 
300.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: " 
301.
if errorlevel 255 goto fehler 
302.
if errorlevel 3 goto abbruch 
303.
if errorlevel 2 goto s3_usb_a 
304.
if errorlevel 1 goto s3_a_usb 
305.
if errorlevel 0 goto goto fehler 
306.
goto fehler 
307.
 
308.
:s3_a_usb 
309.
set source=%onefull%&&set destin=%usbfull% 
310.
goto robo_lst 
311.
:s3_usb_a 
312.
set source=%usbfull%&&set destin=%onefull% 
313.
goto robo_lst 
314.
 
315.
:nu 
316.
echo. 
317.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke 
318.
echo. 
319.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt: 
320.
echo Netzlaufwerk %netdrive% und USB-Stick %usbdrive% 
321.
echo. 
322.
echo Folgende Aktionen sind demnach durchfhrbar: 
323.
echo 1. Synchronisieren von Netzlaufwerk nach USB-Stick 
324.
echo 2. Umgekehrt, von USB-Stick nach Netzlaufwerk 
325.
echo 3. Abbrechen 
326.
echo. 
327.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: " 
328.
if errorlevel 255 goto fehler 
329.
if errorlevel 3 goto abbruch 
330.
if errorlevel 2 goto s4_usb_n 
331.
if errorlevel 1 goto s4_n_usb 
332.
if errorlevel 0 goto goto fehler 
333.
goto fehler 
334.
 
335.
:s4_n_usb 
336.
set source=%netfull%&&set destin=%usbfull% 
337.
goto robo_lst 
338.
:s4_usb_n 
339.
set source=%usbfull%&&set destin=%netfull% 
340.
goto robo_lst 
341.
 
342.
:du 
343.
echo. 
344.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke 
345.
echo. 
346.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt: 
347.
echo Two-Notebook %hddrive% und USB-Stick %usbdrive% 
348.
echo. 
349.
echo Folgende Aktionen sind demnach durchfhrbar: 
350.
echo 1. Synchronisieren von Two-Notebook nach USB-Stick 
351.
echo 2. Umgekehrt, von USB-Stick nach Two-Notebook 
352.
echo 3. Abbrechen 
353.
echo. 
354.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: " 
355.
if errorlevel 255 goto fehler 
356.
if errorlevel 3 goto abbruch 
357.
if errorlevel 2 goto s5_usb_d 
358.
if errorlevel 1 goto s5_d_usb 
359.
if errorlevel 0 goto goto fehler 
360.
goto fehler 
361.
 
362.
:s5_d_usb 
363.
set source=%twofull%&&set destin=%usbfull% 
364.
goto robo_lst 
365.
:s5_usb_d 
366.
set source=%usbfull%&&set destin=%twofull% 
367.
goto robo_lst 
368.
 
369.
:anostick 
370.
echo. 
371.
echo One-Notebook ohne U-Netzlaufwerk oder USB-Stick, keine Synchronisation m”glich.  
372.
goto abbruch 
373.
 
374.
:dnostick 
375.
echo. 
376.
echo Two-Notebook, aber kein USB-Stick gefunden, also keine Synchronisation m”glich 
377.
goto abbruch 
378.
 
379.
:nnoadu 
380.
echo. 
381.
echo Netzlaufwerk U gefunden, aber kein C: oder USB-Stick, keine Synchronisation.  
382.
goto abbruch 
383.
 
384.
:unoadn 
385.
echo. 
386.
echo USB-Stick gefunden, aber kein C: oder Netzlaufwerk, keine Synchronisation.  
387.
goto abbruch 
388.
 
389.
:adnuno 
390.
echo. 
391.
echo One + Two + U: + USB, unm”glich!  
392.
goto fehler 
393.
 
394.
:noadnu 
395.
echo. 
396.
echo Kein One, kein Two, kein U:, kein USB-Stick, unm”glich ... 
397.
goto fehler 
398.
 
399.
:: ---------- Überprüfung der Verzeichnisse ---------- 
400.
:: Robocopy listet zuerst die Unterschiede der Verzeichnisse auf 
401.
:robo_lst 
402.
echo. 
403.
echo 2. šberprfung und Durchsicht der zu synchronisierenden Verzeichnisse 
404.
echo. 
405.
echo Synchronisation von:  
406.
echo %source% 
407.
echo nach:  
408.
echo %destin% 
409.
echo. 
410.
echo Sollen die zu synchronisierenden Verzeichnisse erst berprft werden? 
411.
choice /c jn /t 90 /d n /m "M”chten Sie eine Liste der Unterschiede erhalten? " 
412.
if errorlevel 255 goto fehler 
413.
if errorlevel 2 goto wahl_del 
414.
if errorlevel 1 goto wahl_lst 
415.
if errorlevel 0 goto fehler 
416.
goto fehler 
417.
 
418.
:: Anzeige der Verzeichnis-Unterschiede als Auflistung, ohne zu kopieren 
419.
:wahl_lst 
420.
echo. 
421.
robocopy "%source%" "%destin%" /mir /xo /fft /r:3 /w:10 /l 
422.
pause 
423.
 
424.
:: Synchronity fragt, ob *Extra Dateien auf dem Ziellaufwerk erhalten werden sollen 
425.
:wahl_del 
426.
echo. 
427.
echo 3. Auswahl: "*Extra Datei" im Zielverzeichnis erhalten oder l”schen 
428.
choice /c jn /t 90 /d j /m "Wollen Sie in Quelle gel”schte Dateien in Ziel behalten? " 
429.
if errorlevel 255 goto fehler 
430.
if errorlevel 2 goto syn_mr 
431.
if errorlevel 1 goto syn_cp 
432.
if errorlevel 0 goto fehler 
433.
goto fehler 
434.
 
435.
:: Synchronity fragt ab, ob die Synchronisation mit Erhalt tatsächlich erfolgen soll 
436.
:syn_cp 
437.
echo. 
438.
echo 4. Synchronisation starten, oder abbrechen 
439.
echo. 
440.
echo Synchronisation von: 
441.
echo %source% 
442.
echo nach: 
443.
echo %destin% 
444.
echo. 
445.
echo Sollen die Verzeichnisse nun synchronisiert werden, oder abbrechen? 
446.
choice /c jn /t 90 /d n /m "Soll nun eine Synchronisation durchgefhrt werden? " 
447.
if errorlevel 255 goto fehler 
448.
if errorlevel 2 goto abbruch 
449.
if errorlevel 1 goto start_cp 
450.
if errorlevel 0 goto fehler 
451.
goto fehler 
452.
 
453.
:: Synchronity fragt ab, ob die Synchronisation mit Löschen tatsächlich erfolgen soll 
454.
:syn_mr 
455.
echo. 
456.
echo 4. Synchronisation starten, oder abbrechen 
457.
echo. 
458.
echo Synchronisation von: 
459.
echo %source% 
460.
echo nach: 
461.
echo %destin% 
462.
echo. 
463.
echo Sollen die Verzeichnisse nun synchronisiert werden, oder abbrechen? 
464.
choice /c jn /t 90 /d n /m "Soll nun eine Synchronisation durchgefhrt werden? " 
465.
if errorlevel 255 goto fehler 
466.
if errorlevel 2 goto abbruch 
467.
if errorlevel 1 goto start_mr 
468.
if errorlevel 0 goto fehler 
469.
goto fehler 
470.
 
471.
:: ---------- Durchführung der Synchronisation ---------- 
472.
:: Robocopy kopiert Neue Dateien und Neuere unter Erhalt, also ohne Löschen, der *Extra Dateien im Ziellaufwerk 
473.
:start_cp 
474.
echo. 
475.
echo Synchronisation von: 
476.
echo %source% 
477.
echo nach: 
478.
echo %destin% 
479.
echo unter Erhalten, also ohne L”schen der *Extra Dateien im Ziellaufwerk 
480.
pause 
481.
robocopy "%source%" "%destin%" /e /xo /fft /r:3 /w:10 
482.
goto ende 
483.
 
484.
:: Robocopy kopiert Neue Dateien und Neuere und löscht *Extra Dateien im Ziellaufwerk 
485.
:start_mr 
486.
echo. 
487.
echo Synchronisation von: 
488.
echo %source% 
489.
echo nach: 
490.
echo %destin% 
491.
echo mit L”schen der *Extra Dateien im Ziellaufwerk 
492.
pause 
493.
robocopy "%source%" "%destin%" /mir /xo /fft /r:3 /w:10 
494.
goto ende 
495.
 
496.
:: ---------- Ende-Prozeduren ---------- 
497.
:abbruch 
498.
echo. 
499.
echo Synchronisation abgebrochen, nichts kopiert oder gel”scht, Programmende. 
500.
goto ende_ 
501.
:fehler 
502.
echo. 
503.
echo Synchronisation wegen eines Fehlers nicht gestartet, Programm beendet. 
504.
goto ende_ 
505.
:ende 
506.
echo. 
507.
echo Synchronity wurde erfolgreich durchgefhrt und beendet. 
508.
:ende_ 
509.
endlocal 
510.
echo. 
511.
echo Synchronity %cr%2014 RED-EYE 
512.
pause
Bitte warten ..
Mitglied: rubberman
LÖSUNG 20.10.2014, aktualisiert um 23:03 Uhr
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:
:: USB-Stick mit zwei Methoden erkennen – beide sind unzuverlässig, wenn USB-Sticks eingesteckt und entfernt wurden
Teste mal folgenden Dreizeiler gegen deine Methoden:
01.
@echo off &setlocal 
02.
 
03.
for /f tokens^=2^ delims^=^" %%i in ( 
04.
  'WMIC DISKDRIVE Where "InterfaceType='USB'" Assoc /assocclass:Win32_DiskDriveToDiskPartition 2^>nul ^|findstr /c:"Disk #"' 
05.
) do for /f tokens^=4^ delims^=^" %%j in ('WMIC Path Win32_LogicalDiskToPartition 2^>nul ^|findstr /c:"%%i"') do echo %%j 
06.
 
07.
pause
Grüße
rubberman
Bitte warten ..
Mitglied: red-eye
20.10.2014 um 22:16 Uhr
Hallo rubberman,

vielen Dank, dass Du hier nochmals reingeschaut hast!

Natürlich ist meine Batch nur für sehr wenige Anwendungsbereiche sinnvoll, und für einen Profi wie Dich auch etwas langweilig. Z.B. für den Alltag eines Anwenders, der kein professionelles Synchronisationsprogramm zur Verfügung hat, sich nicht jederzeit an die korrekten Robocopy-Befehle erinnert, und mit dieser detaillierten Batch mit vielen Abfragen versehentliche Löschungen vermeidet.

Dein Vorschlag zur USB-Laufwerks-Suche liefert zuverlässig die korrekten Ergebnisse, und ich könnte vielleicht alle nacheinander gefundenen USB-Laufwerke jeweils hochgezählten Variablen zuordnen. Allerdings stört mich ein wenig die Ausgabe der Meldung "\\DELLVOSTRO3450\ROOT\CIMV2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE1" - Keine Assoziationen verfügbar". Fällt Dir vielleicht eine Methode zur Unterdrückung dieser Statusmeldung ein?

Viele Grüsse,
red-eye
Bitte warten ..
Mitglied: rubberman
20.10.2014, aktualisiert um 23:11 Uhr
Hallo red-eye,

ist offensichtlich eine Fehlermeldung des (ersten?) WMIC Aufrufs. Ich habe mal oben editiert und für beide WMIC Aufrufe Fehlermeldungen durch ein 2>nul in's Nirvana umgeleitet.

Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Variablen Zusammenbauen 2.0 ( Batch ) (6)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst FOR Loop Variablen ( Batch ) (2)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst Grosses Variablen Problem ( Batch) (30)

Frage von clragon zum Thema Batch & Shell ...

VB for Applications
Auswahlliste mit variablen (3)

Frage von Roadrunner777 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...