jap-81
Goto Top

Eine Datei via Batch o.ä. an alle angeschlossenen Wechseldatenträger senden

Guten Tag alle zusammen,

ich habe ein Problem bzw. eine Frage in der mir vieleicht hier jemand helfen kann. Ich suche eine Batch, oder vieleicht etwas ähnliches, die es mir erlaubt eine beliebige Datei auf alle am Rechner angeschlossenen Wechseldatenträger gleichzeitig zu senden.
Mein Porblem ist, dass ich keine Ahnung von Batch habe.

Die Porblemstellung ist folgende. EIn Sportverein stellt bestimmte Videodateien, Dateien von Spielen anderer Vereine, seinen Spielerinnen zur Anschauungszwecken zur Verfügung. Nun müssen derzeit die Dateien in zeitaufwendiger Kleinarbeit einzeln auf USB Sticks geladen werden.
Der Gedange ist alle oder zumindest einen grossen Teil der Sticks an den Rechner anzuschliessen und dann via Batch die Datei gleichzeitig an alle zu senden. Sicher leidet die Geschwindigkeit darunter aber man kann ja wärenddessen andere Sachen erledigen und muss nicht immer Stick rein Stick raus spielen.


Vieleicht hat ja jemand hier eine helfande Idee


Vielen Dank fürs lesen

und einen entspannten Sonntag

Content-ID: 161156

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

76109
76109 20.02.2011 um 12:23:29 Uhr
Goto Top
Hallo jap-81!

Dieses VB-Script (*.vbs) würde zunächst mal nacheinander die Laufwerksbuchstaben der Wechseldatenträger in einer MsgBox ausgeben
    Const Removable = 1

    Dim Fso, Drive
    
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    For Each Drive In Fso.Drives
        If Drive.DriveType = Removable And Drive.IsReady = True Then
            MsgBox Drive.DriveLetter    
        End If
    Next
wobei alle Wechseldatenträger erkannt werden, also z.B. auch Speicherkarten in Card-Reader... Um dies gegebenenfalls auszuschließen, könnte noch das FileSystem der Sticks z.B. "FAT32" oder die Größe des Speicherplatzes mit einbezogen werden?

Gruß Dieter
90957
90957 20.02.2011 um 12:50:24 Uhr
Goto Top
Leider lassen sich auch USB-Sticks problemlos auf NTFS Formatieren...

Soll diese Batch-Datei viele Dateien Verschieben?

Also eine vollständige automatisierung halte ich für nur sehr schwer möglich.
Aber nach anfangseinstellungen sollte das Kopieren problemlos automatisiert werden können.
Wenn die Datei auf der Festplatte liegt, sollten sich die Geschwindigkeitseinbußen eigentlich im
Rahmen halten.

Ich schau mal was sich da machen lässt...

Der Ansatz von Dieter, die Wechseldatenträger über vbs zu ermitteln ist schon mal gar nicht übel...
Was ist das eigentlich für ein Rechner mit so vielen USB-Ports?
Oder habt ihr nur einen großen USB-Hub?

Gruß
BluBb_mADe

*Edit
Ein sinnvollter Tipp wäre vllt auch noch GCopy
NetWolf
NetWolf 20.02.2011 um 12:59:38 Uhr
Goto Top
Hallo,

klar gibt es da hundert Ideen/Möglichkeiten, z.B.:

- eine Homepage von der sich die Mitglieder die Dateien downloaden können
- Free File Hoster (eine "Festplatte" im Internet) von der sich die Mitglieder die Dateien downloaden können (z.B. http:\\www.wuala.com)
- ein FTP-Server
- die Dateien erst mal zu einem Paket packen (ZIP). Also ein selbstentpackendes Archiv erstellen.
- mit einem Synchronisierungsprogramm die Daten kopieren

Gruß
Wolfgang
jap-81
jap-81 20.02.2011 um 13:00:36 Uhr
Goto Top
Hi,

es wird ein bzw mehrere USB Hubs verwendet. Es handelt sich dabei immer nur um ein File (Videodatei).
Vieleicht sollte ich noch erwähnen das es sich um Windows7 handelt.
Friemler
Friemler 20.02.2011 um 14:00:20 Uhr
Goto Top
Hallo jap-81,

versuche mal Dieses Skript:
@echo off

setlocal enabledelayedexpansion

set "DestDir=Test"  
set "WithLog=1"  


set "SrcFiles=%*"  
set "BlockBegin=0"  
set "ValidDrive=0"  

wmic /output:"%Temp%\WMICOut.txt" logicaldisk where description='Wechseldatenträger' get Name,FileSystem /value  

for /f "tokens=1,2 delims==" %%i in ('type "%Temp%\WMICOut.txt"') do (  
  if /i "%%i" equ "FileSystem" set "BlockBegin=1"  
  if "!BlockBegin!" equ "1" if "%%j" neq "" set "ValidDrive=1"  

  if "!BlockBegin!" equ "0" if "!ValidDrive!" equ "1" (  
    set "Drive=%%j"  
    call :ProcessDrive
    set "ValidDrive=0"  
  )

  set "BlockBegin=0"  
)

del "%Temp%\WMICOut.txt"  

if "%WithLog%" equ "1" pause  
exit /b



:ProcessDrive
  setlocal disabledelayedexpansion

  if not exist "%Drive%\%DestDir%" (  
    md "%Drive%\%DestDir%"  
  )

  for %%f in (%SrcFiles%) do (
    if "%WithLog%" equ "1" echo Kopiere %%~f nach %Drive%\%DestDir% ...  
    if "%WithLog%" equ "1" (copy "%%~f" "%Drive%\%DestDir%") else (copy "%%~f" "%Drive%\%DestDir%" > NUL)  
    if "%WithLog%" equ "1" echo.  
  )

  if "%WithLog%" equ "1" echo.  

  endlocal
exit /b
Die Quelldateien können mit der Maus markiert werden und dann per Drag & Drop auf das Icon des obigen Batchfiles gezogen werden.

In Zeile 5 kann ein Zielordner angegeben werden, in dem die Dateien auf den Sticks abgelegt werden. Wenn dieser nicht existiert, wir er in Zeile 39 neu angelegt.

Wenn der Variablen WithLog in Zeile 6 der Wert 1 zugewiesen wird, so wie in obigem Code, werden die Kopiervorgänge auf dem Bildschirm protokolliert und nachdem die Dateien auf alle USB-Sticks kopiert wurden, muss wegen dem Pause-Befehl in Zeile 30 eine Taste gedrückt werden, um das Skript zu beenden. Wenn WithLog in Zeile 6 der Wert 0 (oder etwas anderes) zugewiesen wird, erfolgt keine Bildschirmausgabe und das Skript wird auch von selbst beendet.

Der WMIC-Befehl in Zeile 13 ermittelt alle am Rechner angeschlossenen Wechseldatenträger. Wie User didi1951 schon bemerkt hat, können darunter auch die Speicherkarten in Kartenlesern oder auch USB-Festplatten fallen. USB-Festplatten also vor der Kopieraktion abklemmen und aus Kartenlesern die Speicherkarten herausnehmen. In der FOR-Schleife (Zeile 15-26) wird nämlich nur dann das Unterprogramm ProcessDrive (in dem die Dateien kopiert werden) aufgerufen, wenn ein Wechseldatenträger mit formatiertem Speichermedium gefunden wird.

[EDIT]
Aufgrund von Verbesserungsvorschlägen von bastla habe ich das Skript nochmal geändert, siehe mein nächstes Posting.
[/EDIT]

Gruß
Friemler
bastla
bastla 20.02.2011 um 14:27:36 Uhr
Goto Top
@Friemler
Einige Anmerkungen:

Auch wenn es hier ziemlich egal sein dürfte - nur für die Verwendung der Schalter "BlockBegin" und "ValidDrive" braucht's keine "delayedExpansion" - wenn Du anstelle von "1" einen beliebigen Wert zuweist und anstelle von "0" gar nix, kannst Du einfach mit "if defined" den Zustand abfragen.
Die Verwendung von "wmic" setzt Admin-Rechte voraus - daher würde ich eher (temporäres) VBScript verwenden - zB
For Each D In CreateObject("Scripting.FileSystemObject").Drives:If D.DriveType=1 And D.IsReady Then:WScript.Echo D.DriveLetter:End If:Next
(Achtung - liefert nur den Buchstaben, keinen ":")

[Edit] Der Ordnung halber fehlendes Leerzeichen nach "1" ergänzt [/Edit]
Was alle Vorschläge bisher nicht berücksichtigen ist der Wunsch,
die Datei gleichzeitig an alle zu senden
Dazu könnten dann eigentlich nur mehrere Kopiervorgänge (zB durch Starten eines weiteren Batches mit Übergabeparametern "Quelle" und - an den jeweiligen Laufwerksbuchstaben angepasst - "Ziel") parallel gestartet werden ...
Einen hab ich noch face-wink:
Um die "wmic"-Ausgabe (falls Du dabei bleiben willst) unmittelbar in einer "for"-Schleife zu verwerten, könntest Du das auf folgender Basis versuchen:
for /f "skip=2 tokens=2-3 delims=," %%i in ('"wmic logicaldisk where description='Wechseldatenträger' get Name,FileSystem /value /format:csv"') do if "%%j" neq "" echo %%i
Grüße
bastla
Friemler
Friemler 20.02.2011 um 14:55:58 Uhr
Goto Top
Hi bastla,

ich habe das Skript aufgrund Deiner durchaus sinnvollen Verbesserungsvorschläge nochmal geändert. Wobei ich aber glaube, dass das "gleichzeitige kopieren" der Dateien nicht wörtlich gemeint war.

Dein Vorschlag, die Ausgabe von WMIC im CSV-Format auszuwerten funktioniert nur, wenn man das Gleichheitszeichen der WHERE-Klausel und das Komma zwischen FileSystem und Name beim GET mit ^ escaped und natürlich %%i und %%j vertauscht face-wink. Aber selbst dann kommt es wieder zu Problemen wegen der fehlerhaften Ausgabe von WMIC im ASCII-Mode unter Windows 7, hatten wir letztens schonmal in diesem Thread. Deshalb die Ausgabe von WMIC am besten immer durch TYPE ausgeben lassen und diese Ausgabe auswerten.

Jetzt aber das Skript:
@echo off

setlocal

set "DestDir=Test"  
set "WithLog=1"  

set "SrcFiles=%*"  
set "VBScript=%Temp%\GetDriveLetters.vbs"  

> "%VBScript%" echo For Each D In CreateObject("Scripting.FileSystemObject").Drives  
>>"%VBScript%" echo   If D.DriveType=1 And D.IsReady Then  
>>"%VBScript%" echo     WScript.Echo D.DriveLetter  
>>"%VBScript%" echo   End If  
>>"%VBScript%" echo Next  

for /f %%i in ('cscript /nologo "%VBScript%"') do (  
  set "Drive=%%i:"  
  call :ProcessDrive
)

del "%VBScript%"  

if "%WithLog%" equ "1" pause  
exit /b



:ProcessDrive
  if not exist "%Drive%\%DestDir%" (  
    md "%Drive%\%DestDir%"  
  )

  for %%f in (%SrcFiles%) do (
    if "%WithLog%" equ "1" echo Kopiere %%~f nach %Drive%\%DestDir% ...  
    if "%WithLog%" equ "1" (copy "%%~f" "%Drive%\%DestDir%") else (copy "%%~f" "%Drive%\%DestDir%" > NUL)  
    if "%WithLog%" equ "1" echo.  
  )

  if "%WithLog%" equ "1" echo.  
exit /b

Gruß
Friemler