everytime420
Goto Top

Batch Datei zum erkennen bestimmter USB-Sticks und beschreiben

Guten Morgen face-smile

ich habe ein mehr oder weniger kleines Problem mit einer Batch Datei,
Ich habe ca. 100 USB-Sticks an Kunden verschickt mit einem kleinen Programm.
Nun will ich, dass diese Kunden die Sticks selbst updaten können,per Internet-Download .

Ich habe mir selbst eine Batch Datei geschrieben, die sämtliche Laufwerke abfrägt ob dort die Datei "TECHNIK2010.exe" liegt,
und falls sie dort liegt dann das Update einspielt. Sieht so aus:

@echo off
If Exist E:\Technik2010.exe xcopy %Thisdir%*.* E:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist F:\Technik2010.exe xcopy %Thisdir%*.* F:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist G:\Technik2010.exe xcopy %Thisdir%*.* G:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist H:\Technik2010.exe xcopy %Thisdir%*.* H:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist I:\Technik2010.exe xcopy %Thisdir%*.* I:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist J:\Technik2010.exe xcopy %Thisdir%*.* J:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist K:\Technik2010.exe xcopy %Thisdir%*.* K:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist L:\Technik2010.exe xcopy %Thisdir%*.* L:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist M:\Technik2010.exe xcopy %Thisdir%*.* M:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist N:\Technik2010.exe xcopy %Thisdir%*.* N:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist O:\Technik2010.exe xcopy %Thisdir%*.* O:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist P:\Technik2010.exe xcopy %Thisdir%*.* P:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist Q:\Technik2010.exe xcopy %Thisdir%*.* Q:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist R:\Technik2010.exe xcopy %Thisdir%*.* R:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist S:\Technik2010.exe xcopy %Thisdir%*.* S:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist T:\Technik2010.exe xcopy %Thisdir%*.* T:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist U:\Technik2010.exe xcopy %Thisdir%*.* U:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist V:\Technik2010.exe xcopy %Thisdir%*.* V:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist W:\Technik2010.exe xcopy %Thisdir%*.* W:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist X:\Technik2010.exe xcopy %Thisdir%*.* X:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist Y:\Technik2010.exe xcopy %Thisdir%*.* Y:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
If Exist Z:\Technik2010.exe xcopy %Thisdir%*.* Z:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt
exit

Bei mir am PC funktioniert das auch super, nur wenn ich jetz an meinem Kollegen seinen PC bin der Kartenleser, 2 Laufwerke usw. usw.
hat dann frägt der erst die Kartenleser ab und bringt "Laufwerk ist nicht bereit.." und macht dann erst das Update.
Es sollte aber keine Fehlermeldung kommen.

Vielleicht hilft es auch, dass die Sticks alle den selben Namen haben? "TECHNIK2010"

Hab es bis jetz auch nur auf Windows XP getestet. Ich weiss nicht ob es auch auf Vista Rechnern läuft wegen Berechtigungen usw.

Hoffe ihr könnt mir helfen =)

Grüße

Content-Key: 143713

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

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

Member: BigWim
BigWim May 28, 2010 at 07:16:19 (UTC)
Goto Top
Vielleicht hilf ja ein anderer Ansatz.

Zur Laufzeit der Batchdatei gibt es die Variable %CD%, die auf das aktuelle Verzeichnis zeigt.
Wenn also Deine Batchdatei vom USB-Stick gestartet wird, hast Du damit auch Laufwerksbuchstabe und Pfad.

Mit Set kannst Du auch einen Teilstring bilden, um z. B. nur den Laufwerksbuchstaben zu ermitteln (siehe Help set)

Markus
Member: bastla
bastla May 28, 2010, updated at Oct 18, 2012 at 16:42:18 (UTC)
Goto Top
Hallo everytime420 und willkommen im Forum!

Vielleicht hilft Dir dieser Beitrag ...

Grüße
bastla
Member: bastla
bastla May 28, 2010 at 07:19:54 (UTC)
Goto Top
Hallo BigWim und auch Dir ein Willkommen!
Zur Laufzeit der Batchdatei gibt es die Variable %CD%
Besser wäre in diesem Fall die Variable %0:
echo Laufwerk: %~d0
echo LW und Ordner: %~dp0
echo Voller Pfad: $~f0
Mehr dazu am Ende der Onlinehilfe zu "for" ...

Grüße
bastla
Member: BigWim
BigWim May 28, 2010 at 07:32:06 (UTC)
Goto Top
Danke & Danke

Das kannte ich auch noch nicht. %0 war für mich "nur" Ausgabe des Filenamens.

Markus
Member: everytime420
everytime420 May 28, 2010 at 08:11:28 (UTC)
Goto Top
Vielen Dank schon mal für die schnellen Antworten face-smile
Hab vergessen zu schreiben dass das Update nicht vom USB-Stick ausgeführt wird sondern von der Festplatte..

an bastla: Das ist schon sehr gut den Beitrag kenn ich auch mit dem habe ich mich gestern schon ausseinander gesetzt, nur funktioniert es bei mir nicht ganz
also wenn ich meine .exe in den code eintrage und es ausführe passiert einfach nichts.

@echo off & setlocal
set "GUDL=%temp%\GetUSBDriveLetter.vbs"  
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=2 Then If D.IsReady Then If fso.FileExists(D.DriveLetter^&":\TECHNIK2010.Exe") Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"  
echo Next>>"%GUDL%"  
set LW=
for /f %%i in ('cscript //nologo "%GUDL%"') do set LW=%%i:  
del "%GUDL%"  
if not defined LW cls & echo USB-Festplatte leider nicht erkannt! & echo. & pause & goto :eof
echo USB-Festplatte ist Laufwerk %LW%

Normal Sollte dann ja die meldung mit "USB-Festplatte ist laufwerk E:" zb kommen oder?

Gruß face-smile


[Edit Biber] Codetags nachgetragen. [/Edit]
Member: bastla
bastla May 28, 2010 at 09:37:19 (UTC)
Goto Top
Hallo everytime420!

Im verlinkten Beitrag ging es um eine Festplatte (mit "Drive.Type" 2) - für einen Stick sollte es 1 sein ...

Grüße
bastla
Member: everytime420
everytime420 May 28, 2010 at 09:55:57 (UTC)
Goto Top
@ bastla

hab ich auch schon versucht aber dann findet er nichts. -> "..leider nicht erkannt"
mit drive.type 2 und der korrekten .exe findet er es glaub ich aber die batch schließt sich dann einfach anstatt weiter zu arbeiten,
wenn ich eine falsche .exe reinschreib, findet er auch nichts -> "..leider nicht erkannt"

Externe Festplatte wird doch auch als Removal erkannt oder nicht?

EDIT: also habs mit ner externen festplatte auch versucht mit der .exe drauf. Passiert genau dasselbe wie beim USB-Stick auch
cmd promt popt kurz auf und schließt sich sofort wieder.

gruß
Mitglied: 60730
60730 May 28, 2010 at 13:13:00 (UTC)
Goto Top
Moin,

cmd promt popt kurz auf und schließt sich sofort wieder.

Testbatch immer so starten:

  • start
  • ausführen
  • cmd
  • batch ins Fenster schieben

Keinesfalls per Doppelklick auf die .cmd/.bat- erst recht nicht, wenn das führende @echo off drin steht.

gruß
Member: bastla
bastla May 28, 2010 at 13:35:56 (UTC)
Goto Top
Hallo everytime420!
cmd promt popt kurz auf und schließt sich sofort wieder.
Was Timo hinsichtlich des Testens eines Batches angemerkt hat, kann ich nur unterstützen: Um zu sehen, was passiert, brauchst Du entweder ein offenes CMD-Fenster oder zumindest als letzte Zeile im Batchablauf einen "pause"-Befehl ...

... dann könntest Du auch die "Erfolgsmeldung" lesen. face-wink

Grüße
bastla
Member: everytime420
everytime420 May 31, 2010 at 05:52:46 (UTC)
Goto Top
Hey Leute,

okay schlimmer Anfänger Fehler face-big-smile jetz läufts danke face-smile
Jetz hab ich versucht wieder per xcopy drauf zu kopieren. Aber läuft nicht so ganz.
Wie muss ich das machen dass es nur kopiert, wenn er das Laufwerk auch tatsächlich gefunden hat?
So bringt er nur "Datei nocopy.txt konnte nicht gelesen werden" "0 Dateien kopiert".


@echo off & setlocal
set "GUDL=%temp%\GetUSBDriveLetter.vbs"
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=2 Then If D.IsReady Then If fso.FileExists(D.DriveLetter^&":\TECHNIK2010.exe") Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"
echo Next>>"%GUDL%"
set LW=
for /f %%i in ('cscript //nologo "%GUDL%"') do set LW=%%i:
del "%GUDL%"
if not defined LW cls & echo USB-Festplatte leider nicht erkannt! & echo. & pause & goto :eof
echo USB-Festplatte ist Laufwerk %LW%

xcopy %Thisdir%*.* %LW%:\ /S /R /Y /H /I /E /V /exclude:nocopy.txt


Vielen Dank =)
Member: bastla
bastla May 31, 2010 at 08:23:54 (UTC)
Goto Top
Hallo everytime420!
Wie muss ich das machen dass es nur kopiert, wenn er das Laufwerk auch tatsächlich gefunden hat?
Wenn es nicht gefunden wurde, erfährst Du das aufgrund der "if not defined ..."-Zeile (wenn Du den Batch unter "<code>" und "</code>"-Tags gepostet hättest, könnte ich hier die Zeilennummer nennen) und es wird der Batch beendet.
So bringt er nur "Datei nocopy.txt konnte nicht gelesen werden" "0 Dateien kopiert".
Zur Sicherheit den vollständigen Pfad angeben ...

Abgesehen davon:
Was soll denn in der Variablen %ThisDir% stehen, bzw wie erhält sie einen Inhalt?
In %LW% steht (siehe Ende der "for-Zeile) bereits der Buchstabe und der Doppelpunkt - Letzterer ist daher in der "xcopy"-Zeile nicht mehr nötig (und "/S" auch nicht, wenn Du ohnehin "/E" verwendest).

Grüße
bastla
Member: everytime420
everytime420 May 31, 2010 at 12:12:35 (UTC)
Goto Top
achso okay danke.
so sieht das ganze jetz aus und läuft face-smile

Vielen Dank für eure Hilfe! Besonders an bastla face-smile

@echo off & setlocal
set "GUDL=%temp%\GetUSBDriveLetter.vbs"  
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=2 Then If D.IsReady Then If fso.FileExists(D.DriveLetter^&":\TECHNIK2010.exe") Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"  
echo Next>>"%GUDL%"  
set LW=
for /f %%i in ('cscript //nologo "%GUDL%"') do set LW=%%i:  
del "%GUDL%"  
if not defined LW cls & echo Technik2010-Stick leider nicht erkannt! & echo. & pause & goto :eof
echo Technik2010-Stick ist Laufwerk %LW%
cd /D %~d0%~p0
set pfad=%cd%
xcopy "%pfad%\*.*" %LW%\ /R /Y /H /I /E /V /exclude:nocopy.txt  
echo msgbox"Update wurde eingepielt!",vbExclamation , "Daten kopiert!"> msg.vbs  
msg.vbs
erase msg.vbs
exit

Gruß
420
Member: bastla
bastla May 31, 2010 at 12:48:59 (UTC)
Goto Top
Hallo 420!

Freut mich, dass es soweit klappt ... face-smile

Noch eine Anmerkung: Da Du ja mit temporärem VBS arbeitest, würde es sich anbieten, auch die Fehlermeldung aus Zeile 8 auf diese Weise auszugeben - im einfachsten Fall (ungetestet) etwa so:
@echo off & setlocal
set "GUDL=%temp%\GetUSBDriveLetter.vbs"  
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=2 Then If D.IsReady Then If fso.FileExists(D.DriveLetter^&":\TECHNIK2010.exe") Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"  
echo Next>>"%GUDL%"  
set LW=
for /f %%i in ('cscript //nologo "%GUDL%"') do set LW=%%i:  
del "%GUDL%"  
if not defined LW (set "Info1=Technik2010-Stick leider nicht erkannt!" & set "Info2=Stick nicht erkannt!" & goto :Msg)  
::echo Technik2010-Stick ist Laufwerk %LW%
cd /D %~d0%~p0
set pfad=%cd%
xcopy "%pfad%\*.*" %LW%\ /R /Y /H /I /E /V /exclude:nocopy.txt  
set "Info1=Update wurde eingepielt!" & set "Info2=Daten kopiert!"  
:Msg
echo msgbox "%Info1%",vbExclamation,"%Info2%"> msg.vbs  
msg.vbs
erase msg.vbs
Grüße
bastla
Member: everytime420
everytime420 Jun 02, 2010 at 05:16:01 (UTC)
Goto Top
Ahhh okay face-smile noch besser ;)

So hab ich's jetz eingebaut.

Wie würdet Ihr es bereitstellen zum Download für die Kunden ?

Ich hab jetz ein selbstentpackendes Archiv mit WinRar erstellt, damit die Ordnerstuktur nicht verloren geht die die batch ja kopieren soll.
Nur ist das ja manchmal ein Problem wegen Virenscanner und Download bzw. eMail-Versand weil es ja eine .exe ist.

Wisst ihr irgendwelche Alternativen? Hab schon solche .bat to .exe converter ausprobiert aber die ziehen ja auch nicht die Ordner Struktur mit ein.

Gruß
420
Member: everytime420
everytime420 Jun 09, 2010 at 12:12:53 (UTC)
Goto Top
Hey Leute,

Jetz hab ich noch ein Problem oO

Unsere Aussendienstler haben das Programm auf Ihren Laptops also auf der Festplatte.

Kann ich irgendwie die gleiche batch verwenden für die Suche auf Festplatten und anschließendes kopieren?
Das Problem ist halt dass die "Technik2010.exe" ja nicht direkt auf C:\ beispielsweise liegt sondern irgendwo in einem Unterordner.
Hoffe ihr wisst was ich meine.

Wär echt klasse face-smile

Gruß
Member: bastla
bastla Jun 09, 2010 at 13:20:41 (UTC)
Goto Top
Hallo everytime420!

Eigentlich ist das ein organisatorisches Problem - lege den Speicherort verbindlich fest und gut ist ...

Falls es wirklich erforderlich sein sollte, den Ordner zu suchen, sollte ja zumindest das Laufwerk bekannt sein - für LW C: sollte der Pfad dann so zu ermitteln sein:
for /f "delims=" %%i in ('dir /s /b C:\Technik2010.exe') do set "pfad=%%~dpi"
Grüße
bastla
Member: everytime420
everytime420 Jun 11, 2010 at 09:39:08 (UTC)
Goto Top
Hey bastla!

du hast eigentlich recht ich lass es einfach in "%programfiles%\Technik2010\" installieren, dann dauert es auch nicht solange bis er die .exe gefunden hat.

Aber was mache ich jetzt noch falsch?

::@echo off & setlocal

cd /D %~d0%~p0
set pfad=%cd%

If Exist %Programfiles%\TECHNIK2010\TECHNIK2010.exe xcopy %pfad%\*.* %Programfiles%\TECHNIK2010\ /R /Y /H /I /E /V (set "Info1=Update wurde eingepielt!" & set "Info2=Daten kopiert!")  

if not Exist %Programfiles%\TECHNIK2010\TECHNIK2010.exe (set "Info1=Technik2010-Stick leider nicht erkannt!" & set "Info2=Stick nicht erkannt!")  

:Msg
echo msgbox "%Info1%",vbExclamation,"%Info2%"> msg.vbs  
msg.vbs
erase msg.vbs

Gruß
420
Member: bastla
bastla Jun 11, 2010 at 10:51:33 (UTC)
Goto Top
Hallo everytinme420!


Grüße
bastla