[Gelöst] Batch: USB-Stick mit seinem Namen erkennen

schl3ck

schon lange hier
Hallo,

ich habe einen Ordner, den ich regelmäßig auf einen USB-Stick kopiere. Das ist ja ganz einfach, nur das Problem ist, dass ich mal mehrere USB-Sticks/virtuelle Laufwerke am PC hängen hab, und da kann ich den bestimmten USB-Stick nich immer als erstes anstecken.

Meine Frage also: Ist es möglich, in einer Batch-Datei nach dem Namen des USB-Sticks oder Laufwerks zu fragen, und wenn der richtige Name erkannt ist, soll er den Ordner rüber kopieren.
Damit ich nicht vorher noch durch das ganze Verzeichniss navigieren muss, hab ich eine Desktop-Verknüpfung zur Batch-Datei angelegt.

Vielen Dank schon im Vorraus.
 
Danke erstmal, aber könntest du das bitte für nen Neuling erklären? Ich weiß nämlich grad, wie man den echo-, xcopy- und cd-Befehl verwendet (natürlich auch wie man die Hilfe aufruft)
 
Es gibt auch die Möglichkeit, mit dem USB Drive Letter Manager einem bestimmten USB-Stick immer den gleichen Laufwerksbuchstaben zuteilen zu lassen.

Die Installation von USDLM ist einfach, die Konfiguration (über eine INI-Datei) nicht immer ganz trivial. Trotzdem gehört das Tool immer mit zu dem ersten, was ich nach einer Windwos-Neuinstallation wieder installiere. Enorm praktisch ist nämlich auch die Tatsache, dass die diversen Slots eines eingebauten Cardreaders erst dann einen Laufwerksbuchstaben zugeteilt bekommen, wenn tatsächliche eine Speicherkarte im Schacht steckt.

Auch kann man unter Win7 den Schreibcache für USB-Laufwerke wieder aktivieren. Und einen Bereich an Laufwerksbuchstaben definieren, der für USB-Laufwerke reserviert werden soll.

Und noch einiges mehr. Ist für mich persönlich nahezu unentbehrlich geworden. Und das schönste ist: das Tool ist für private Nutzung unentgeltlich.
 
Ich habe mich bei ähnlichen Sachen immer damit beholfen, indem ich einfach eine leere Datei (null Byte) mit dem Namen des jeweiligen Sticks in dessen Hauptverzeichnis angelegt hatte. Die lässt sich per Batch problemlos auf ihr Vorhandensein abfragen und nimmt keinerlei Platz weg. Ist je nach Dateisystem nur ein Eintrag in der FAT oder MFT. Eventuell lässt sich aber auch mit dem Befehlszeilenkommando label das Volumelabel in der Batchdatei auslesen und verwerten. Wie das geht, müsste ich aber erst wieder nachschauen, lang ist's her mit so etwas.
 
ok, etwas ausführlicher:

Die Batchdatei speicherst Du auf deinem Stick. Wenn Du die dann mit einem Doppelklick
ausführst, werden relative Pfadangaben von dem aktuellen Pfad ausgehend behandelt.
Du kennst den Laufwerksbuchstaben des Sticks nicht (oder er wechselt) darum lässt Du ihn
bei der Angabe des Zielverzeichnisses weg. Ein Beispiel mit dem Befehl xcopy könnte so
aussehen:

xcopy C:\EinOrdner\Quellverzeichnis \Zielordner_auf_dem_Stick


Selbstverständlich können Quell- und Zielordner beliebig tief verschachtelt sein. Wenn Du Leerzeichen
im Pfad hast, muss der ganze Pfad in Anführungszeichen gesetzt werden.
 
Danke an alle, für die vielen Tipps. Ich werde heute irgendwann mal schauen, zu was ich mich durchringen kann.

Das mit der Batch auf dem USB ist zwar die einfachste Methode, allerdings bin ich zu faul, jedesmal den Stick zu öffnen. Eine Desktopverknüpfung geht ja auch nicht, da die auch wieder den Laufwerksbuchstaben haben will. Das mit der 0 Byte-Datei klingt für mich am besten. Man könnte auch einfach nach dem Ordner fragen, in dem das ganze dann hinein kommt, oder täusche ich mich da?
 
Man könnte auch einfach nach dem Ordner fragen, in dem das ganze dann hinein kommt, oder täusche ich mich da?
Das geht natürlich auch, wenn er nur auf einem oder mehreren gewünschten Sticks vorkommt. Das Verfahren wäre dann genau dasselbe wie mit der 0-Byte-Datei.
 
Ich habe meiner externen HDD einmalig einfach einen höheren Laufwerksbuchstaben über die Datenträgerverwaltung zugeordnet. Da Windows sich diese Einstellung merkt, hat diese Festplatte immer den Buchstaben M, wenn ich sie anschließe. Alle anderen Wechseldatenträger bekommen immer die deutlich niedrigeren Buchstaben zugewiesen.

Man sollte dabei jedoch darauf achten, einen Buchstaben zu wählen, der auch bei Anschluss mehrerer externer Geräte nicht durch die Automatische Vergabe belegt wird (E,F,G = schlechte Wahl). Denn wenn der Buchstabe belegt ist, weißt Windows der Festplatte wieder den nächsten freien zu. Bei M ist das jedoch (zumindest bei mir) seeehr unwahrscheinlich.
 
Code:
@echo off
for %%i in (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 (
	for /f "tokens=6 delims= " %%a in ('vol %%i:') do (
		call :%%a
	)
)
exit /b

:: Nach dem Doppelpunkt (=Name der Sprungmarke) kommt der Name des Datenträgers.
:: Der Name des Datenträgers darf KEIN LEERZEICHEN enthalten.
:SYSTEM
echo Dies ist die System-routine
exit /b

:DATASTORE
echo Dies ist die Datastore-routine
exit /b

:BACKUP
echo Dies ist die Backup-routine
exit /b
 
Tausend dank! :huld

Ich versteh bei dem Code zwar nichts, freue mich aber riesig, dass er funktioniert :)

Schöner wärs natürlich, wenn keine Fehlermeldungen kommen würden (zB. "Das Gerät ist nicht bereit" oder "Die Sprungmarke xxx wurde nicht gefunden"), aber das ist nicht nötig.
 
Ok, wenn dich das stört...

Code:
@echo off
for %%i in (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 (
	if exist %%i:\* (
		for /f "tokens=6 delims= " %%a in ('vol %%i: 2^>^&0') do (
			call :%%a
		)
	)
)
exit /b

:: Nach dem Doppelpunkt (=Name der Sprungmarke) kommt der Name des Datenträgers.
:: Der Name des Datenträgers darf KEIN LEERZEICHEN enthalten.
:SYSTEM
echo Dies ist die System-routine
exit /b

:DATASTORE
echo Dies ist die Datastore-routine
exit /b

:BACKUP
echo Dies ist die Backup-routine
exit /b

Sogar n tick schneller dank der if-abfrage da nicht jedes mal gearbeitet wird, sondern nur bei "begründetem verdacht" ^^
 
Nach ein paar Mal kommt jetzt immer eine Meldung, dass irgend ein Pfad nicht gefunden wurde:
USB.jpg

Das ist nicht weiter schlimm, aber ich frag mich, was er da macht.
 
Weiß denn niemand was dazu?

Zusätzlich, zu der komischen Fehlermeldung, ist mir aufgefallen, dass die kopierten Dokumente am USB-Stick garnicht vorhanden sind. Er schreibt zwar hin, dass er es kopiert hat, aber wenn ich auf das Änderungsdatum schiele, steht da noch immer das Alte.

Ich hab es auch nur mit dem xcopy Befehl alleine Probiert, da macht er was er soll.

Der Code, der in der Batch-Datei steht:
Code:
@echo off
for %%i in (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 (
	if exist %%i:\* (
		for /f "tokens=6 delims= " %%a in ('vol %%i: 2^>^&0') do (
			call :%%a
		)
	)
)
exit /b

:: Nach dem Doppelpunkt (=Name der Sprungmarke) kommt der Name des Datenträgers.
:: Der Name des Datenträgers darf KEIN LEERZEICHEN enthalten.

:Boot
exit /b

:Installations
exit/b

:Data
exit /b

:Recover
exit /b

:Stick
echo.
echo --------------
echo Daten kopieren
echo --------------
echo.
xcopy *.xl* \einOrdner\ /y/d/e
echo.
pause
exit
 
Is mir imho schon klar, dass der nicht macht was er machen soll. Zwar erkennt die Batch den Stick am namen, aber das wars dann auch schon. Das Arbeitsverzeichnis (WICHTIG für relative Pfade im Dateisystem) bleibt gleich (also dort wo die Batch angelegt ist).

Probier doch mal das:
Code:
@echo off
for %%i in (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 (
	if exist %%i:\* (
		for /f "tokens=6 delims= " %%a in ('vol %%i: 2^>^&0') do (
			set myDrive=%%i
			call :%%a
		)
	)
)
exit /b

:: Nach dem Doppelpunkt (=Name der Sprungmarke) kommt der Name des Datenträgers.
:: Der Name des Datenträgers darf KEIN LEERZEICHEN enthalten.

:Boot
exit /b

:Installations
exit/b

:Data
exit /b

:Recover
exit /b

:Stick
echo.
echo --------------
echo Daten kopieren
echo --------------
echo.
cd %myDrive%:
xcopy *.xl* \einOrdner\ /y/d/e
echo.
pause
exit

Das kopiert aber die Dateien nur in den Ordner "einOrdner" im Laufwerk "%myDrive%".
Wenn du dass auf ne anderen Datenträger kopieren willst, dann musst du beim Ziel schon einen absoluten Pfad angeben.
Wenn du aber das Ziellaufwerk auch mit dem Laufwerksnamen identifizieren willst, dann sind etwas grössere Umbauarbeiten vonnöten...


EDIT:
So. Habs mal komplett umgearbeitet.
Keine Vermutungen mehr, sondern harte Fakten was die Variablen angeht.
Die Funktion zum Abfragen des Laufwerks anhand der Laufwerksbezeichnung hab ich auch eingefügt.
Weiters unterstützt das Script jetzt auch Laufwerke mit Leerzeichen in der Bezeichnung.

Code:
@echo off
setlocal enabledelayedexpansion
for /F "skip=1 tokens=1,2,* delims=:" %%a in ('wmic logicaldisk where "DriveType=2 OR DriveType=3" get name^, volumename') do (
	set Drive=%%a && set Label=%%b %%c && set Label=!Label: =!
	call :!Label!
)
pause
exit /b

:SYSTEM
set Drive=X
call :GETDRIVELETTER %Label%
echo Systemdrive - %Drive%
exit /b

:DATASTORE
echo Datengrab - %Drive%
exit /b

:BACKUP
echo Backupdrive - %Drive%
exit /b

:16GIGHackdrive
echo USB Stick Hackdrive - %Drive%
exit /b

:INTENSO
echo USB Stick Frontschwein - %Drive%
exit /b



:: FUNKTIONEN
:GETDRIVELETTER
for /F "skip=1 tokens=1 delims=:" %%x in ('wmic logicaldisk where ^"volumename^=^'%1^'^" get name') do set Drive=%%x
goto :EOF


EDIT2: FYI: Die Sprungmarken unterstützen KEINE Leerzeichen, daher diese bei den Sprungmarken einfach entfernen. Bei dem Label in der Variable werden alle Leerzeichen entfernt.
Bsp hier: "16GIGHackdrive" ist im Original "16GIG Hackdrive"
 
Zuletzt bearbeitet:
Danke, aber er kopiert es zwar, aber nicht an den richtigen Ort.
Der Ausgangsort liegt am Laufwerk E:\ in irgendeinem Ordner. Wo die kopierten Daten landen: E:\einOrdner\ obwohl er vorher mit %Drive% den richtigen Laufwerksbuchstaben (I) angezeigt hat.

Hier nochmal mein Code:
Code:
@echo off
setlocal enabledelayedexpansion
for /F "skip=1 tokens=1,2,* delims=:" %%a in ('wmic logicaldisk where "DriveType=2 OR DriveType=3" get name^, volumename') do (
    set Drive=%%a && set Label=%%b %%c && set Label=!Label: =!
    call :!Label!
)
pause
exit /b

:Boot
set Drive=X
call :GETDRIVELETTER %Label%
echo Systemdrive - %Drive%
rem Laufwerk C
exit /b

:Installations
echo Installationen - %Drive%
rem Laufwerk D
exit /b

:Data
echo Datengrab - %Drive%
rem Laufwerk E
exit /b

:Recover
echo Backupdrive - %Drive%
rem Laufwerk H
exit /b

:MeinStick
echo Der richtige Stick - %Drive%
rem Laufwerk I
cd %Drive%
xcopy *.xl* \einOrdner\
exit /b



:: FUNKTIONEN
:GETDRIVELETTER
for /F "skip=1 tokens=1 delims=:" %%x in ('wmic logicaldisk where ^"volumename^=^'%1^'^" get name') do set Drive=%%x
goto :EOF
"rem Laufwerk *" steht für den derzeitigen Laufwerksbuchstaben.

Was ich am Code verändert hab: 2 Sprungmarken entfernt, 1 hinzugefügt, Sprungmarkennamen abgeändert
 
Sry, mein Fehler

Code:
:MeinStick
echo Der richtige Stick - %Drive%
rem Laufwerk I
cd /D %Drive%:
xcopy *.xl* \einOrdner\
exit /b
 
Komisch. Funktioniert noch immer nicht. Er kopierts wieder auf E:\
Außerdem schreibt er, die Syntax für die Datenträgerbezeichnung sei falsch.

Hab den Befehl mal ohne "echo off" eusgeführt, da zeigt ein Leerzeichen zwischen Buchstaben und Doppelpunkt an.

Das wird wohl nix :( :cry:
 
Das verwundert mich. Probier mal die Zeile wie folgt abzuändern:
Code:
set Drive=%%a && set Drive=!Drive: =! && set Label=%%b %%c && set Label=!Label: =!
 
Oben