sam-razr
Goto Top

Batch Script: Nur auf betsimmte USB Sticks kopieren

Folgende Situation:

Habben in der Lateinklasse 30 Schüler, jeder mit USB-Stick und einen riesen HUB.


Suche ein solches Script, bzw. erweiterung für eins ganz unten:

*Kopiert den Ordner "C:\Latein" auf bestimmte Ordner bestimmter USB Sticks
*evtl. MSGBOX: Kopieren fertig

da laufwerksbuchsatben ja nie gleichbleiben müsste warscheinlich irgendeine signatur/ID auf dem stiock ausgelesen werden

wenns geht das ganze auch noch andersrum, d.h. alles aus den Ordner "Latein2" auf den sticks in den Ordner "C:Latein2"


Kann mir wer helfen?

Content-Key: 52966

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

Printed on: April 18, 2024 at 11:04 o'clock

Member: Dynadrate
Dynadrate Mar 01, 2007 at 16:28:09 (UTC)
Goto Top
Vielleicht hilft es dir, wenn die Laufwerksbuchstaben ein bissl gebändigt würden: USBDLM
Member: Xerebus
Xerebus Mar 01, 2007 at 17:21:24 (UTC)
Goto Top
Textdateien auf die Sticks USB_Stick.txt und per Batch auf die abfragen.

if exist e:\USB_Stick.txt copy ....
if exist f:\USB_Stick.txt copy ....
if exist g:\USB_Stick.txt copy ....
if exist h:\USB_Stick.txt copy ....
if exist i:\USB_Stick.txt copy ....
Da funktioniert auch mit unterschiedlichen txt Dateien und dardurch unterschiedlichen copybefehlen.
Member: Sam-Razr
Sam-Razr Mar 01, 2007 at 17:59:21 (UTC)
Goto Top
Textdateien auf die Sticks USB_Stick.txt und
per Batch auf die abfragen.

if exist e:\USB_Stick.txt copy ....
if exist f:\USB_Stick.txt copy ....
if exist g:\USB_Stick.txt copy ....
if exist h:\USB_Stick.txt copy ....
if exist i:\USB_Stick.txt copy ....
Da funktioniert auch mit unterschiedlichen
txt Dateien und dardurch unterschiedlichen
copybefehlen.


Habe hier folgendes script:

Set WshShell = Wscript.CreateObject("Wscript.Shell")
Return = WshShell.Run("cmd /c xcopy /Y /E /C /Q /I /R C:\Latein ""J:\Latein""",,true)
MsgBox "Kopieren beendet!", vbInformation


Wie soll ich da die abfrage einbauen?

so:

Set WshShell = Wscript.CreateObject("Wscript.Shell")
Return = WshShell.Run("cmd /c xcopy /Y /E /C /Q /I /R /if exist e:\USB_Stick.txt copy C:/Latein ""J:\Latein""",,true)
MsgBox "Kopieren beendet!", vbInformation

????

Sorry, aber bin da noch nicht so weit bei dem Thema
Member: Sam-Razr
Sam-Razr Mar 05, 2007 at 15:03:45 (UTC)
Goto Top
Bitte ich brauche dazu hilfe! Wie binde ic das jetzt ein?

Set WshShell = Wscript.CreateObject("Wscript.Shell")
if exist "K:\usb_stick_für_kopieren.sig" Then WshShell.Run("cmd /c xcopy /Y /E /C /Q /I /R C:\Latein ""K:\Latein""",,true)
MsgBox "Kopieren beendet!", vbInformation

so klappts net! BITTE! Ich brauchs dringend!

Sam
Member: Dani
Dani Mar 25, 2007 at 10:52:54 (UTC)
Goto Top
Hi,
dein Problem noch aktuell?!


Grüße
Dani
Member: Sam-Razr
Sam-Razr Mar 25, 2007 at 14:26:28 (UTC)
Goto Top
Hi,
dein Problem noch aktuell?!


Grüße
Dani

Ja. Wäre sehr nett.

Sam
Member: Dani
Dani Mar 25, 2007 at 15:13:09 (UTC)
Goto Top
Hi,
also zuerst auf allen Sticks folgende Dateien anlegen:
- 1 Datei. Der Name der Datei soll vorname_nachname.xyz sein
- 1 Datei. Diese Datei soll auf jeden Stick mit dem gleichen Namen (aaa_23424.xyz - Vorraussetzung!!!).

Eine Datei ist für das kopieren zum Stick nötig und die andere für das kopieren von allen angeschlossenen Sticks. Durch das aaa... muss sein, sonst steht die Datei mit dem Namen nicht zu letzt da. Die Endung ist so gewollt!!

Hier mal die v0.1:
@echo off & setlocal

::Variablen
set from_usb=aaa_23424..xyz


echo Abfrage
echo 1 - Datei auf einen Stick kopieren
echo 2 - Dateien vom Stick auf Festplatten kopieren
echo.
set /p abschnitt=Menue: 
echo.


if /i "%abschnitt%" == "1" (  
	::Frage nach dem Schülername - Zwischen Vorname und NAchname muss ein _,
	::sonst kann der nicht nachschauen, welches Laufwerk zutrifft
	set /p name=Schueler (vorname_nachname): 

	for /D %%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 (
		REM Überprüft, ob Laufwerk vorhanden
		if /i exist %%a: (
			::Überpürft, ob die vorname_nachname Datei vorhanden ist
			if /i exist "%%a:\%name%.xyz" (  
				::Kopiert die Dateien von C auf den Stick
				xcopy /e /v /c /i /y "C:\Latein" "%%a:\latein"  
			)
		)
	)
)

if /i "%abschnitt%" == "2" (  
	for /l %%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 (
		REM Überprüft, ob Laufwerk vorhanden
		if /i exist %%a: (
			::Überpürft, ob die aaa_ - DATEI vorhanden ist
			if /i exist "%%a:\%from_usb%.xyz" (  
				::Liest den Namen der Schülers aus
				for /f "delmis=. tokens=1" %%b in ('dir /b "%%a:\*.xyz"') do (  
					::Erstellt einen Ordner auf C: mit dem Namen des Schülers
					if not exist "C:\Latein2\%%b" mkdir "C:\Latein2\%%b"  
					
					::Kopiert alle Dateien aus dem Ordner und fügt diese auf C:latein\name ein
					xcopy /e /v /c /i /y "%%a:\latein2" "C:\Latein2\%%b"  
				)				
			)
		)
	)
)
echo Fertig!
pause
Ist leider ungetestet. Aber du wirst die nicht vorhandenen Fehler bestimmt selber lösen können. Ansonsten einfach wieder melden. *gg*


Grüße
Dani
Member: Sam-Razr
Sam-Razr Mar 25, 2007 at 15:53:25 (UTC)
Goto Top
Danke schonmal habe aber immer noch ein Problem

Ich hab die Datei ein bisschen umgebaut (die dateien heissen anders (das müsste doch gehen))
also:
- 1. Datei: vorname_nachname.sig (Diese Datei wird individuell angepasst)
- 2. Datei: aaa_Signatur_Schülerstick.sig (Diese datei wird einfach auf jeden Stick kopiert)
So sieht das Script jetzt aus:

@echo off & setlocal

::Variablen
set from_usb=aaa_Signatur_Schülerstick.sig

echo Abfrage
echo 1 - Datei auf einen Stick kopieren
echo 2 - Dateien vom Stick auf Festplatten kopieren
echo.
set /p abschnitt=Menue:
echo.

if /i "%abschnitt%" == "1" (
::Frage nach dem Schülername - Zwischen Vorname und NAchname muss ein _,
::sonst kann der nicht nachschauen, welches Laufwerk zutrifft, vorname nachname werden individuell ersetzt
set /p name=Schueler (vorname_nachname):

for /D %%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 (
REM Überprüft, ob Laufwerk vorhanden
if /i exist %%a: (
::Überpürft, ob die vorname_nachname Datei vorhanden ist
if /i exist "%%a:\%vorname_nachname%.sig" (
::Kopiert die Dateien von C auf den Stick
xcopy /e /v /c /i /y "C:\Latein" "%%a:\Latein"
)
)
)
)

if /i "%abschnitt%" == "2" (
for /l %%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 (
REM Überprüft, ob Laufwerk vorhanden
if /i exist %%a: (
::Überpürft, ob die aaa_ - DATEI vorhanden ist
if /i exist "%%a:\%from_usb%.xyz" (
::Liest den Namen der Schülers aus
for /f "delmis=. tokens=1" %%b in ('dir /b "%%a:\*.xyz"') do (
::Erstellt einen Ordner auf C: mit dem Namen des Schülers
if not exist "C:\Latein2\%%b" mkdir "C:\Latein2\%%b"

::Kopiert alle Dateien aus dem Ordner und fügt diese auf C:latein\name ein
xcopy /e /v /c /i /y "%%a:\latein2" "C:\Latein2\%%b"
)
)
)
)
)
echo Fertig!
pause


Wo liegt der Fehler? Ich speicher das als xy.bat und starte es. dann steht da halt

Abfrage

1 - Blabla
2 - Blabla

Menue


Dann tipp ich eins 1 und drüc eingabetaste.
das fenster schliesst sich und nichts passiert. Irgendwie hab ich das gefühl ein ganz blöder fehler.wäre nett wenn du mir dabei noch helfen könntest

Sam
Member: Dani
Dani Mar 25, 2007 at 16:01:28 (UTC)
Goto Top
Hi,
also entferne mal das "i" => "if /i "%abschnitt%" == "1" ". Warum das nicht geht, weiß ich grad auch nicht.


Grüße
Dani
Member: Sam-Razr
Sam-Razr Mar 25, 2007 at 16:34:09 (UTC)
Goto Top
Hierbei

@echo off & setlocal

::Variablen
set from_usb=aaa_Signatur_Schülerstick.sig

echo Abfrage
echo 1 - Datei auf einen Stick kopieren
echo 2 - Dateien vom Stick auf Festplatten kopieren
echo.
set /p abschnitt=Menue:
echo.

if/ "%abschnitt%" == "1" (
::Frage nach dem Schülername - Zwischen Vorname und NAchname muss ein _,
::sonst kann der nicht nachschauen, welches Laufwerk zutrifft, vorname nachname werden individuell ersetzt
set /p name=Schueler (samuel_straka):

for /D %%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 (
REM Überprüft, ob Laufwerk vorhanden
if/ exist %%a: (
::Überpürft, ob die vorname_nachname Datei vorhanden ist
if /i exist "%%a:\%samuel_straka.sig" (
::Kopiert die Dateien von C auf den Stick
xcopy /e /v /c /i /y "C:\Latein" "%%a:\Latein"
)
)
)
)

if/ "%abschnitt%" == "2" (
for /l %%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 (
REM Überprüft, ob Laufwerk vorhanden
if/ exist %%a: (
::Überpürft, ob die aaa_ - DATEI vorhanden ist
if/ exist "%%a:\%from_usb%.sig" (
::Liest den Namen der Schülers aus
for /f "delmis=. tokens=1" %%b in ('dir /b "%%a:\*.xyz"') do (
::Erstellt einen Ordner auf C: mit dem Namen des Schülers
if not exist "C:\Latein2\%%b" mkdir "C:\Latein2\%%b"

::Kopiert alle Dateien aus dem Ordner und fügt diese auf C:latein\name ein
xcopy /e /v /c /i /y "%%a:\latein2" "C:\Latein2\%%b"
)
)
)
)
)
echo Fertig!
pause


kommt der Fehler:

der Befehl if konnte nicht gefunden werden
Member: Biber
Biber Mar 25, 2007 at 20:08:10 (UTC)
Goto Top
Moin Sam-Razr und Dani,

ein paar kleine kosmetische Änderungen habe ich eingebaut.

Sieht jetzt so aus:
@echo off & setlocal
::Variablen
set from_usb=aaa_Signatur_Schülerstick.sig
:again
echo Abfrage
echo 0 - Batch beenden, keine Aktion 
echo 1 - Datei auf einen Stick kopieren
echo 2 - Dateien vom Stick auf Festplatten kopieren
echo.
set /p abschnitt=Menue: 
echo.
if "%abschnitt%" LSS "0" if "%abschnitt%" GEQ "2" goto :again   
If %abschnitt%=="0" goto :eof  
goto :Abschnitt%abschnitt%

:Abschnitt1
REM ---if /i "%abschnitt%" == "1" (  
::Frage nach dem Schülername - Zwischen Vorname und NAchname muss ein _,
::sonst kann der nicht nachschauen, welches Laufwerk zutrifft, vorname nachname werden individuell ersetzt
set /p name=Schueler (vorname_nachname):

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 (
  REM Überprüft, ob Laufwerk vorhanden
  REM -- if /i exist %%a: (
  REM ::Überprüft, ob die vorname_nachname Datei vorhanden ist
   Dir %%a: 2>&1|find "nicht bereit" >nul || if /i exist "%%a:\%name%.sig" (  
     REM Kopiert die Dateien von C auf den Stick
     xcopy /e /v /c /i /y "C:\Latein" "%%a:\Latein"  
  )
)
goto :EndOfWork

:Abschnitt2
REM ---if /i "%abschnitt%" == "2" (  
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 (
   Dir %%a: 2>&1|find "nicht bereit" >nul || if exist "%%a:\%from_usb%" (  
       REM Liest den Namen der Schülers aus
       for /f "delims=. tokens=1" %%b in ('dir /b "%%a:\%from_usb"') do (  
          REM Erstellt einen Ordner auf C: mit dem Namen des Schülers
          if not exist "C:\Latein2\%%b" mkdir "C:\Latein2\%%b"  

           REM Kopiert alle Dateien aus dem Ordner und fügt diese auf C:latein\name ein
           xcopy /e /v /c /i /y "%%a:\latein2" "C:\Latein2\%%b"  
           ) 
        )
    )
)

:endOfWork
echo Fertig!
pause

TODO's:
--> unbedingt die Liste der in Frage kommenden USB-Laufwerksbuchstaben einschränken.
Von A: bis Z: ist (egal auf welchem Rechner) Dönekens.
--> Unbedingt noch eine Meldung zum Unterscheiden von "es wurde etwas" und "es wurde nichts" kopiert. Nach dem Xcopy.

Gruss
Biber
Member: Sam-Razr
Sam-Razr Mar 25, 2007 at 20:15:04 (UTC)
Goto Top
Danke, das is schonmal nette veränderung! :great:
Member: Dani
Dani Mar 28, 2007 at 19:41:19 (UTC)
Goto Top
G' Abend,
wie ist dein Status bei deinem Problem?!


Grüße
Dani
Member: Sam-Razr
Sam-Razr Mar 28, 2007 at 21:36:11 (UTC)
Goto Top
Momentan ganz gut, Am HeimPC mit 2 Sticks hats geklappt. Nach den ferien müssen wir das ma in groß in der achule testen
Member: Biber
Biber Mar 28, 2007 at 22:23:18 (UTC)
Goto Top
Moin Sam-Razr und Dani,

wenn du magst, Sam-Razr, dann poste doch mal den überarbeiteten Stand.
Dann machen wir noch eine gemeinschaftliche Vier(zig)-Augen-Kontrolle des Schnipsels.

Denn so ganz richtig ernsthaft hab ich damals auch keine Änderungen getestet, eher grob zusammengeharkt.

Eben ist mir jedenfalls aufgefallen, dass die Wahrscheinlichkeit, dass ein eingegebenes Zeichen sowohl kleiner Null als auch größergleich 2 ist, doch nicht gross genug ist für einen Schul-Einsatz.

Die Kiddies würden Dich für so einen Klopfer in die Schülerzeitung bringen. face-wink
Deshalb:
<u>Streiche:</u> if "%abschnitt%" LSS "0" if "%abschnitt%" GEQ "2" goto :again   

<u>Setze:</u> if "%abschnitt%" LSS "0"  (goto :again ) Else if "%abschnitt%" GTR "2" goto :again   

[also: wenn %abschnitt% kleiner "0" geheZu :again andernfalls wenn %abschnitt% grösser "2" geheZu :again]

Genauer hab ich aber noch nicht nachgeschaut ... sollte ja nur einer grobe Korrektur sein.

Vom Fertigstellungsdatum des final release candidates mal abgesehen: eigentlich könntest Du die Frage aber schon auf "gelöst" setzen, oder?

Gruss Biber
Member: Sam-Razr
Sam-Razr Mar 29, 2007 at 08:33:18 (UTC)
Goto Top
Ich bin heute ziemlich im Stress, ich kann morgen abend mal das posten.

Was meisnt du mit "auf gelöst setzten"?
Member: Biber
Biber Mar 29, 2007 at 10:45:56 (UTC)
Goto Top
Moin Sam-Razr,
Ich bin heute ziemlich im Stress
Wir alle arbeiten mit M$-Produkten.. face-wink
Zu Deiner Frage
Den Beitrag kannst Du als Beitragsersteller auf "gelöst/erledigt" setzen,
indem Du dich anmeldest und dann auf den Eröffnungsbeitrag (also die Frageselbst) gehst.
Dort den Button "Editieren" drücken, im aufgehenden Fenster kommen ein paar Kontrollkästchen.
Unter anderem "Dieser Beitrag gilt als gelöst".
Der erzeugt den grünen Haken.

Dann kann jeder andere Forumsbenutzer von weitem erkennen:
Für die Frage "Batch Skript - Nur auf bestimmte USB-Sticks kopieren" gab es mindestens einen brauchbaren Lösungsansatz.

Gruss
Biber