red-eye
Goto Top

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

@ 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

Content-ID: 252334

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

Ausgedruckt am: 05.11.2024 um 08:11 Uhr

schmitzi
Lösung schmitzi 18.10.2014 aktualisiert um 22:19:00 Uhr
Goto Top
Hi,

check mal ECHO !usb%count2%!

Gruss RS
rubberman
Lösung rubberman 18.10.2014 aktualisiert um 22:19:06 Uhr
Goto Top
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
red-eye
red-eye 18.10.2014 um 21:21:16 Uhr
Goto Top
Hallo schmitzi und rubberman,

herzlichen Dank für Eure hilfreichen Antworten! face-smile

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
rubberman
Lösung rubberman 18.10.2014 aktualisiert um 22:19:11 Uhr
Goto Top
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
red-eye
red-eye 18.10.2014 aktualisiert um 22:17:19 Uhr
Goto Top
Hi rubberman,

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

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! face-smile Vielen Dank!

Beste Grüße,
red-eye
red-eye
red-eye 19.10.2014 um 18:24:25 Uhr
Goto Top
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

@ echo off

:: ---------- Synchronisations-Parameter ----------
:: Variablen definieren und leeren
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=
set q=& set r=& set s=& set t=& set u=& set v=& set w=& set x=& set y=& set z=
set hddrive=& set netdrive=&set usbdrive=& set oneuser=& set onepath=& set twouser=& set twopath=& set netpath=& set usbpath=
set cr=& set f1=& set f2=& set onefull=& set twofull=& set netfull=& set usbfull=& set erhalten=& set source=& set destin=
set count1=& set count2=& set countx=& set county=& set laufvar1=& set laufvar2=& set laufvarx=& set laufvary=

:: Bekannte Laufwerke festlegen
set hddrive=C:
set netdrive=U:

:: Bekannte Pfade festlegen, Schritt für Schritt
set oneuser=\Users\RED-EYE
set onepath=\Documents\Eigene Dateien\SYNCHRONISATIONSVERZEICHNIS
set twouser=\Users\RED-EYE
set twopath=\Documents\RED-EYE\02\SYNCHRONISATIONSVERZEICHNIS
set netpath=\Eigene Dateien\SYNCHRONISATIONSVERZEICHNIS
set usbpath=\Eigene Dateien\SYNCHRONISATIONSVERZEICHNIS

:: ---------- Programmdarstellung ----------
:: Codepage für Copyright-Zeichen, die &&’s ohne Leerzeichen und die Zeilenenden sind genau so notwendig
for /f "tokens=2 delims=:." %%n in ('chcp') do set codepg=%%n&& chcp 1250  
set cr=©&& chcp %codepg%
title Synchronity %cr%2014 RED-EYE

:: Startbildschirm mit Farbe und neuem Bildschirm, alles nur für die Optik
color 1f&& cls&& echo.
echo S y n c h r o n i t y
echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.
echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.&& echo.
timeout /t 5

:: Kurzanleitung, Synchronity ist Synchronicity 2
color f1&& cls&& echo.
echo Synchronisation der Speicherorte fr "Synchronisation" mit Robocopy  
echo.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke  
echo.
echo 2. šberprfung und Durchsicht der zu synchronisierenden Verzeichnisse
echo   - "Neuer" ist eine Datei, die im Quellverzeichnis aktueller ist  
echo   - "Neue Datei" liegt nur im Quell-, und nicht im Zielverzeichnis vor  
echo   - "*EXTRA Datei" existiert im *Ziel-, aber nicht im Quellverzeichnis  
echo.
echo 3. Auswahl: "*Extra Datei" im Zielverzeichnis erhalten oder l”schen  
echo.
echo 4. Synchronisation starten, oder abbrechen (mit Sicherheitsabfrage)
timeout /t 5

:: ---------- Laufwerke erkennen, definieren, abfragen ----------
:: Alle aktiven Laufwerke erkennen, zuvor noch mit "setlocal" Variablen erst innerhalb for-Schleife berechnen lassen und Variablen zurücksetzen 
:: Die Befehlsverknüpfung von vol mit && (=nur nach erfolgreichem ersten Befehl den zweiten ausführen) ohne Leerzeichen ist genau so notwendig
setlocal enabledelayedexpansion
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=)
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 (
  vol %%a: >nul 2>nul&& set usbdrv%%a=%%a:
  if not "!usbdrv%%a!"=="" (  
    if not "!laufvar1!"=="" (  
      set /a count1=!count1!+1&& set laufvar1=!laufvar1!, %%a:
      ) else (
      set /a count1=!count1!+1&& set laufvar1=%%a:
      )
    ) else (
    if not "!laufvarx!"=="" (  
      set /a countx=!countx!+1&& set laufvarx=!laufvarx!, %%a:
    ) else (
      set /a countx=!countx!+1&& set laufvarx=%%a:
      )
    )
  )

:: Aktive Wechsel-Laufwerke erkennen (logisch vermutlich E bis J), vorher Variablen zurücksetzen
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=)
for %%b in (E F G H I J) do (
  vol %%b: >nul 2>nul&& set usbdrv%%b=%%b:
  if not "!usbdrv%%b!"=="" (  
    if not "!laufvar2!"=="" (  
      set /a count2=!count2!+1&& set laufvar2=!laufvar2!, %%b:
      ) else (
      set /a count2=!count2!+1&& set laufvar2=%%b:
      )
    ) else (
    if not "!laufvary!"=="" (  
      set /a county=!county!+1&& set laufvary=!laufvary!, %%b:
    ) else (
      set /a county=!county!+1&& set laufvary=%%b:
      )
    )
  )

:: Aktive Laufwerke und Wechsel-Laufwerke ausgeben und Entscheidungen festlegen
if "%count1%" LEQ "1" (set d=ist) else (set d=sind)  
if "%count1%" GEQ "1" set e=Laufwerk& if "%count2%" GEQ "1" set f1=und& if "%count2%" GEQ "1" set f2=Wechsel-Laufwerk  
if "%count1%" GEQ "2" set g=e& if "%count2%" GEQ "2" set h=e  
if not "%laufvar1%"=="" set i=(%laufvar1%)& if not "%laufvar2%"=="" set j=(%laufvar2%)  
echo.&& echo Es %d% %count1% %e%%g% %i% %f1% %count2% %f2%%h% %j% aktiv.

if "%count2%" LEQ "1" goto usbfest  
if "%count2%" GEQ "2" goto wahlstck  

:: USB-Stick mit zwei Methoden erkennen – beide sind unzuverlässig, wenn USB-Sticks eingesteckt und entfernt wurden
:: Die erste liefert "", wenn keiner, korrektes Laufwerk, wenn einer, und irgendein Laufwerk, wenn mehrere USB-Sticks 
:: Die zweite liefert E:, wenn keiner, korrektes Laufwerk, wenn einer, und erstes, wenn mehrere USB-Sticks vorhanden
:usbfest
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  
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:

:: Erkennen, ob kein, oder ein oder mehrere USB-Sticks angeschlossen sind
:: Achtung, die Bedingung des obersten if darf nicht in einem Unter-if erneut formuliert werden!
if "%usbdriv1%"=="%usbdriv2%" (  
  if "%usbdriv1%"=="" (  
    echo.&& echo USB-Laufwerk-Suche ergab logischen Fehler, gehe zu Fehler.&& goto fehler
    ) else (
      echo.&& echo Ein USB-Laufwerk wurde korrekt gefunden, es geht weiter ...&& goto usbfest2
    )
  ) else (
    if "%usbdriv1%"=="" (  
      echo.&& echo Kein USB-Laufwerk vorhanden, beende daher Synchronity.&& goto abbruch
      ) else (
        echo.&& echo Mehr als ein USB-Laufwerk, oder unzuverl„ssige Erkennung, gehe zur Auswahl.&& goto wahlstck
    )
  )

:: USB-Laufwerk wurde erkannt und wird nun festgelegt
:usbfest2
if "%usbdriv1%"=="%usbdriv2%" (set usbdrive=%usbdriv1%) else (set usbdrive=X:)  
goto gehtweit

:: USB-Stick mit choice manuell auswählen
:wahlstck
echo.
:: echo Auswahl des fr die Synchronisation gewnschten USB-Laufwerks,
:: echo Folgende Auswahl kann demnach getroffen werden:
:: for %%e in (E F G H I J) do (if not "!usbdrv%%e!"=="" echo !usbdrv%%e!) 
choice /c EFGHIJX /t 90 /d X /m "W„hlen Sie das gewnschte USB-Laufwerk, oder Abbruch mit X: "  
if errorlevel 255 goto fehler
if errorlevel 7 goto abbruch
if errorlevel 6 goto sx_6
if errorlevel 5 goto sx_5
if errorlevel 4 goto sx_4
if errorlevel 3 goto sx_3
if errorlevel 2 goto sx_2
if errorlevel 1 goto sx_1
if errorlevel 0 goto goto fehler
goto fehler

:sx_1
set usbdrive=E:
goto gehtweit
:sx_2
set usbdrive=F:
goto gehtweit
:sx_3
set usbdrive=G:
goto gehtweit
:sx_4
set usbdrive=H:
goto gehtweit
:sx_5
set usbdrive=I:
goto gehtweit
:sx_6
set usbdrive=J:
goto gehtweit

:: Pfade zusammensetzen
:gehtweit
set onefull=%hddrive%%oneuser%%onepath%
set twofull=%hddrive%%twouser%%twopath%
set netfull=%netdrive%%netpath%
set usbfull=%usbdrive%%usbpath%

:: USB-Pfad für Synchronisationsverzeichnis anlegen, falls nicht vorhanden 
:: Achtung, die Bedingung des obersten if darf nicht in einem Unter-if erneut formuliert werden!
if not "%usbdrive%"=="X:" (  
    if exist "%usbfull%" (  
        echo.&& echo USB-Laufwerk gefunden, USB-Verzeichnis vorhanden, alles ok, weiter ...&& goto weiterso
    ) else (
        echo.&& echo USB-Laufwerk gefunden, USB-Verzeichnis nicht vorhanden, wird erstellt.&& md "%usbfull%"&& goto weiterso  
    )
) else (
    if exist "%usbfull%" (  
        echo.&& echo Kein USB-Laufwerk gefunden, dennoch USB-Verzeichnis vorhanden, logischer Fehler.&& goto fehler
    ) else (
        echo.&& echo Kein USB-Laufwerk, kein USB-Verzeichnis, plausibel, beende Synchronity.&& goto weiterso
    )
)

:: Überprüfung der Verzeichnisse (Anführungszeichen wegen Leerzeichen notwendig!)
:weiterso
if exist "%onefull%" (set p=j) else (set p=n)  
if exist "%twofull%" (set q=j) else (set q=n)  
if exist "%netfull%" (set s=j) else (set s=n)  
if exist "%usbfull%" (set t=j) else (set t=n)  

:: Sinnvolle und häufige Kombinationen
if %p%%q%%s%%t%==jnjj goto anu
if %p%%q%%s%%t%==jnjn goto an
if %p%%q%%s%%t%==jnnj got au
if %p%%q%%s%%t%==njnj goto du

:: Fehler-Kombinationen
if %p%%q%%s%%t%==jnnn goto anostick
if %p%%q%%s%%t%==njnn goto dnostick
if %p%%q%%s%%t%==nnjn goto nnoadu
if %p%%q%%s%%t%==nnnj goto unoadn
if %p%%q%%s%%t%==jjjj goto adnuno
if %p%%q%%s%%t%==nnnn goto noadnu

:: ---------- Abfragen zur Auswahl der Laufwerke ----------
:: One-Notebook mit U-Netzlaufwerk und USB-Stick
:anu
echo.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke  
echo.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt: 
echo One-Notebook %hddrive%, Netzlaufwerk %netdrive% und USB-Stick %usbdrive%
echo.
echo Folgende Aktionen sind demnach durchfhrbar: 
echo 1. Synchronisieren von One-Notebook %hddrive% nach Netzlaufwerk %netdrive%
echo 2. Umgekehrt, von Netzlaufwerk %netdrive% nach One-Notebook %hddrive%
echo 3. Synchronisieren von One-Notebook %hddrive% nach USB-Stick %usbdrive%
echo 4. Umgekehrt, von USB-Stick %usbdrive% nach One-Notebook %hddrive%
echo 5. Synchronisieren von Netzlaufwerk %netdrive% nach USB-Stick %usbdrive%
echo 6. Umgekehrt, von USB-Stick  %usbdrive% nach Netzlaufwerk %netdrive%
echo 7. Abbrechen
echo.
choice /c 1234567 /t 90 /d 7 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: "  
if errorlevel 255 goto fehler
if errorlevel 7 goto abbruch
if errorlevel 6 goto s1_u_n
if errorlevel 5 goto s1_n_u
if errorlevel 4 goto s1_u_a
if errorlevel 3 goto s1_a_u
if errorlevel 2 goto s1_n_a
if errorlevel 1 goto s1_a_n
if errorlevel 0 goto goto fehler
goto fehler

:s1_a_n
set source=%onefull%&& set destin=%netfull%
goto robo_lst
:s1_n_a
set source=%netfull%&& set destin=%onefull%
goto robo_lst
:s1_a_u
set source=%onefull%&& set destin=%usbfull%
goto robo_lst
:s1_u_a
set source=%usbfull%&& set destin=%onefull%
goto robo_lst
:s1_n_u
set source=%netfull%&& set destin=%usbfull%
goto robo_lst
:s1_u_n
set source=%usbfull%&& set destin=%netfull%
goto robo_lst

:an
echo.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke  
echo.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt: 
echo One-Notebook %hddrive% und Netzlaufwerk %netdrive%
echo.
echo Folgende Aktionen sind demnach durchfhrbar: 
echo 1. Synchronisieren von One nach Netzlaufwerk
echo 2. Umgekehrt, von Netzlaufwerk nach One
echo 3. Abbrechen
echo.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: "  
if errorlevel 255 goto fehler
if errorlevel 3 goto abbruch
if errorlevel 2 goto s2_n_a
if errorlevel 1 goto s2_a_n
if errorlevel 0 goto goto fehler
goto fehler

:s2_a_n
set source=%onefull%&&set destin=%netfull%
goto robo_lst
:s2_n_a
set source=%netfull%&&set destin=%onefull%
goto robo_lst

:au
echo.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke  
echo.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt:
echo One-Notebook %hddrive% und USB-Stick %usbdrive%
echo.
echo Folgende Aktionen sind demnach durchfhrbar:
echo 1. Synchronisieren von One-Notebook nach USB-Stick
echo 2. Umgekehrt, von USB-Stick nach One-Notebook
echo 3. Abbrechen
echo.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: "  
if errorlevel 255 goto fehler
if errorlevel 3 goto abbruch
if errorlevel 2 goto s3_usb_a
if errorlevel 1 goto s3_a_usb
if errorlevel 0 goto goto fehler
goto fehler

:s3_a_usb
set source=%onefull%&&set destin=%usbfull%
goto robo_lst
:s3_usb_a
set source=%usbfull%&&set destin=%onefull%
goto robo_lst

:nu
echo.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke  
echo.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt:
echo Netzlaufwerk %netdrive% und USB-Stick %usbdrive%
echo.
echo Folgende Aktionen sind demnach durchfhrbar:
echo 1. Synchronisieren von Netzlaufwerk nach USB-Stick
echo 2. Umgekehrt, von USB-Stick nach Netzlaufwerk
echo 3. Abbrechen
echo.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: "  
if errorlevel 255 goto fehler
if errorlevel 3 goto abbruch
if errorlevel 2 goto s4_usb_n
if errorlevel 1 goto s4_n_usb
if errorlevel 0 goto goto fehler
goto fehler

:s4_n_usb
set source=%netfull%&&set destin=%usbfull%
goto robo_lst
:s4_usb_n
set source=%usbfull%&&set destin=%netfull%
goto robo_lst

:du
echo.
echo 1. Auswahl der fr "Synchronisation" zu synchronisierenden Laufwerke  
echo.
echo Folgende Laufwerke fr eine m”gliche Synchronisation wurden erkannt:
echo Two-Notebook %hddrive% und USB-Stick %usbdrive%
echo.
echo Folgende Aktionen sind demnach durchfhrbar:
echo 1. Synchronisieren von Two-Notebook nach USB-Stick
echo 2. Umgekehrt, von USB-Stick nach Two-Notebook
echo 3. Abbrechen
echo.
choice /c 123 /t 90 /d 3 /m "Bitte w„hlen Sie die Nummer der gewnschten Aktion: "  
if errorlevel 255 goto fehler
if errorlevel 3 goto abbruch
if errorlevel 2 goto s5_usb_d
if errorlevel 1 goto s5_d_usb
if errorlevel 0 goto goto fehler
goto fehler

:s5_d_usb
set source=%twofull%&&set destin=%usbfull%
goto robo_lst
:s5_usb_d
set source=%usbfull%&&set destin=%twofull%
goto robo_lst

:anostick
echo.
echo One-Notebook ohne U-Netzlaufwerk oder USB-Stick, keine Synchronisation m”glich. 
goto abbruch

:dnostick
echo.
echo Two-Notebook, aber kein USB-Stick gefunden, also keine Synchronisation m”glich
goto abbruch

:nnoadu
echo.
echo Netzlaufwerk U gefunden, aber kein C: oder USB-Stick, keine Synchronisation. 
goto abbruch

:unoadn
echo.
echo USB-Stick gefunden, aber kein C: oder Netzlaufwerk, keine Synchronisation. 
goto abbruch

:adnuno
echo.
echo One + Two + U: + USB, unm”glich! 
goto fehler

:noadnu
echo.
echo Kein One, kein Two, kein U:, kein USB-Stick, unm”glich ...
goto fehler

:: ---------- Überprüfung der Verzeichnisse ----------
:: Robocopy listet zuerst die Unterschiede der Verzeichnisse auf
:robo_lst
echo.
echo 2. šberprfung und Durchsicht der zu synchronisierenden Verzeichnisse
echo.
echo Synchronisation von: 
echo %source%
echo nach: 
echo %destin%
echo.
echo Sollen die zu synchronisierenden Verzeichnisse erst berprft werden?
choice /c jn /t 90 /d n /m "M”chten Sie eine Liste der Unterschiede erhalten? "  
if errorlevel 255 goto fehler
if errorlevel 2 goto wahl_del
if errorlevel 1 goto wahl_lst
if errorlevel 0 goto fehler
goto fehler

:: Anzeige der Verzeichnis-Unterschiede als Auflistung, ohne zu kopieren
:wahl_lst
echo.
robocopy "%source%" "%destin%" /mir /xo /fft /r:3 /w:10 /l  
pause

:: Synchronity fragt, ob *Extra Dateien auf dem Ziellaufwerk erhalten werden sollen
:wahl_del
echo.
echo 3. Auswahl: "*Extra Datei" im Zielverzeichnis erhalten oder l”schen  
choice /c jn /t 90 /d j /m "Wollen Sie in Quelle gel”schte Dateien in Ziel behalten? "  
if errorlevel 255 goto fehler
if errorlevel 2 goto syn_mr
if errorlevel 1 goto syn_cp
if errorlevel 0 goto fehler
goto fehler

:: Synchronity fragt ab, ob die Synchronisation mit Erhalt tatsächlich erfolgen soll
:syn_cp
echo.
echo 4. Synchronisation starten, oder abbrechen
echo.
echo Synchronisation von:
echo %source%
echo nach:
echo %destin%
echo.
echo Sollen die Verzeichnisse nun synchronisiert werden, oder abbrechen?
choice /c jn /t 90 /d n /m "Soll nun eine Synchronisation durchgefhrt werden? "  
if errorlevel 255 goto fehler
if errorlevel 2 goto abbruch
if errorlevel 1 goto start_cp
if errorlevel 0 goto fehler
goto fehler

:: Synchronity fragt ab, ob die Synchronisation mit Löschen tatsächlich erfolgen soll
:syn_mr
echo.
echo 4. Synchronisation starten, oder abbrechen
echo.
echo Synchronisation von:
echo %source%
echo nach:
echo %destin%
echo.
echo Sollen die Verzeichnisse nun synchronisiert werden, oder abbrechen?
choice /c jn /t 90 /d n /m "Soll nun eine Synchronisation durchgefhrt werden? "  
if errorlevel 255 goto fehler
if errorlevel 2 goto abbruch
if errorlevel 1 goto start_mr
if errorlevel 0 goto fehler
goto fehler

:: ---------- Durchführung der Synchronisation ----------
:: Robocopy kopiert Neue Dateien und Neuere unter Erhalt, also ohne Löschen, der *Extra Dateien im Ziellaufwerk
:start_cp
echo.
echo Synchronisation von:
echo %source%
echo nach:
echo %destin%
echo unter Erhalten, also ohne L”schen der *Extra Dateien im Ziellaufwerk
pause
robocopy "%source%" "%destin%" /e /xo /fft /r:3 /w:10  
goto ende

:: Robocopy kopiert Neue Dateien und Neuere und löscht *Extra Dateien im Ziellaufwerk
:start_mr
echo.
echo Synchronisation von:
echo %source%
echo nach:
echo %destin%
echo mit L”schen der *Extra Dateien im Ziellaufwerk
pause
robocopy "%source%" "%destin%" /mir /xo /fft /r:3 /w:10  
goto ende

:: ---------- Ende-Prozeduren ----------
:abbruch
echo.
echo Synchronisation abgebrochen, nichts kopiert oder gel”scht, Programmende.
goto ende_
:fehler
echo.
echo Synchronisation wegen eines Fehlers nicht gestartet, Programm beendet.
goto ende_
:ende
echo.
echo Synchronity wurde erfolgreich durchgefhrt und beendet.
:ende_
endlocal
echo.
echo Synchronity %cr%2014 RED-EYE
pause
rubberman
Lösung rubberman 20.10.2014 aktualisiert um 23:03:56 Uhr
Goto Top
Hallo red-eye.

Das Script fällt bei mir in die Rubrik tl;dr weil ich es nicht benötige (also keine Wertung face-wink).
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
Grüße
rubberman
red-eye
red-eye 20.10.2014 um 22:16:52 Uhr
Goto Top
Hallo rubberman,

vielen Dank, dass Du hier nochmals reingeschaut hast! face-smile

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
rubberman
rubberman 20.10.2014 aktualisiert um 23:11:40 Uhr
Goto Top
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