traxtormer
Goto Top

Ein Batch von Wechseldatenträger soll ein Batch am Festplattenlaufwerk öffnen....Danach das Batch auf Wechseldatenträger schliessen und Stick entfernen

Hallo Leute,

ich will mit einem Batch (eigentlich will ich es später alles auf EXE ändern), dass auf einem USB-Stick läuft, ein Batch/EXE auf der Festplatte öffnen und das, von dem geöffnet wurde beenden.
Das Problem ist nur, dass sich das Batch vom Stick nicht schließen lässt (Task-Manager noch immer sichtbar).
Danach soll der Stick deaktiviert werden, er lässt sich aber nicht.

Code vom EXE auf Stick

..
..
..
echo Copying of the files was successful! %date% %time% >> C:\Log.txt
echo Copying of the files was successful!
pause
:end_usb

echo ----------------------------------------

call "C:\INSTALL\Server_setup.exe"  

exit

Danach soll jetzt Server_setup auf C: gestartet werden und der USB-Stick deaktiviert werden.

..
..
echo ----------------------------------------

TASKKILL /F /T /IM RTOOL.exe

echo Deactivating USB-Stick!
rundll32 shell32.dll,Control_RunDLL hotplug.dll

echo ----------------------------------------
..
..

Der Stick lässt sich einfach nicht beenden?!

SG

Content-ID: 149307

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

Ausgedruckt am: 23.11.2024 um 04:11 Uhr

60730
60730 19.08.2010 um 10:59:02 Uhr
Goto Top
Moin,

  • wenn eine bat auf einem Stick läuft, kann man logischerweise den Stick nicht auswerfen.
  • wenn du die bat verexen willst - erzeugst du - beim starten des bat exe eine Version der bat im %temp% Ordner.

Von daher finde ich das bat verexen zwar hirnrissig - aber in deinem speziellen Fall wird dann die bat wenigstens im Temp - nicht auf dem Stick benutzt und daher wäre die Wahrscheinlichkeit, dass die bat den Stick auswerfen kann größer.

Gruß
Biber
Biber 19.08.2010 um 11:25:59 Uhr
Goto Top
Moin traxformer,

zur Verdeutlichung: mit "..wenn eine bat auf einem Stick läuft, " meint T-Mo, dass der Batch ja noch aktiv ist,
weil du dein Setup-Geraffel mit "Call ...Setup.exe" aufrufst.
Ist mir einerseits auch ein Rätsel, warum es denn noch mal zurück in den Batch gehen soll, nur um dort ein "exit" zu machen...
Andererseits finde ich es dann schon wieder stimmig, wenn du dieses Skriptchen für so ausgereift hältst, dass du daraus eine *.Exe erzeugen willst, damit es professioneller aussieht.
Bzw. keiner mehr den Sourcecode lesen oder bei YouTube einstellen kann.

Grüße
Biber
Traxtormer
Traxtormer 19.08.2010 um 11:49:47 Uhr
Goto Top
Hello Leute,

das ganze ist natürlich nur ein kleiner Teil meines kleinen "Programms". Da das ganze dann doch recht umfasssend ist und ich sehr viel mühe und Zeit (Lernzeit face-smile) reingesteckt habe, will ich von den ganzen dann natürlich alleine den Sourcecode besitzen. => Deshalb verexen (Ich denke, dass es dennoch Möglichkeiten gibt aus einem EXE den Sourcecode zu extrahieren ODER?)

Ihr habt recht, ich will dennoch nur ein batch vom stick starten, dass ein anderes Bat im C:\.,.. Ordner kopiert und dieses dann ausführt. Parallel soll das bat auf dem Stick dann geschlossen werden, damit der Stick deaktiviert werden kann. Das File sollte auf jeden Fall zuerst auf dem Stick gestartet werden. Ich habe inziwschen auch keine andere Möglichkeit gefunden, als das der "Starter" sich den restlichen Code auf die Festplatte kopiert und das Programm dann lokal weiterarbeitet. Dennoch schaffe ich es nicht, dass sich der Stick ohne Fehlermeldung deaktivieren lässt, obwohl kein Fenster was darauf zugreifen würde, geöffnet ist. => Deswegen habe ich es mal mit taskkill probiert.

Könnt Ihr mir da weiterhelfen?

SG,

Daniel
60730
60730 19.08.2010 um 13:28:48 Uhr
Goto Top
Moin,

[OT]
wie ich dir bereits schrub...

  • zur Laufzeit entpackt sich die exe eh zur bat
  • wenn ich meine bescheidenen Werke in Sachen Bat/cmd betrachte - und sehe das Bastla, Biber Lot, MIniversum, und und und mal für jemanden anderen gebaut haben.....

Dann - sehe ich, das die von mir erfundenen Räder von anderen zu einer anderen Zeit fast genauso gestrickt wurden.

Und jemand, der einfache/doppelte/dreifache For Schleifen entziffern kann - der kann auch im Taskmanager sehen, das eine exe eine cmd gestartet hat und spätestens dann - dazu muß man also die exe nichtmal durch einen "Editor" jagen - sieht man den quellencode.

Und selbst wenn man nicht so "helle" ist - die Zeile 7
echo Deactivating USB-Stick!
entlarvt deine Batch als Batch.... face-wink

btw: Ich finde Opensource genial - und der "Seitenhieb" sei gestattet - alles was ich für andere schreibe - schreibe ich für alle anderen - nicht für diesen speziellen Fragesteller alleine.

Opensource find ich gut und jeder - der was kann - hat von anderen gelernt.
[/OT]

Ohne deine komplette bat zu shen, dann dir keiner schreiben - wo es klemm - denn der zusammengeklaubte Befehl rundll32 shell32.dll,Control_RunDLL hotplug.dll funktioniert üblicherweise -wenn wirklich nichts mehr läuft.


Gruß
Traxtormer
Traxtormer 19.08.2010 um 13:54:40 Uhr
Goto Top
OK da hast du recht face-smile
echo ist schnell entlarvt........naja es war ja einen versuch wert ^^

Es geht mir da darum, dass dieser "Code" der Batches nur durch mich erfolgen sollen und nicht durch andere Personen. Aber das hat sich ja wahrscheinlich sowieso erledigt, da man es leicht einsehen kann....


Die Sache ist folgende:

Es klemmt eigentlich nur noch bei diesem deaktivieren des Sticks. Ansonsten ist das ganze restliche Batch eher nur mit copy befehlen und kleinen Schleifen versehen, also habe ich mir gedacht ich gehe gleich zum eigentlichen Thema und lasse das andere einfach weg.

Hättest du trotzdem vielleicht ein paar Ideen wie man das Ganze bewerkstelligen kann?

SG
Friemler
Friemler 20.08.2010 um 06:06:35 Uhr
Goto Top
Hallo Traxtormer,

zum Auswerfen von USB-Sticks gibt es das Tool RemoveDrive von Uwe Sieber, erhältlich hier. Das Tool wirft USB-Sticks direkt aus, ohne das ein Dialog erscheint wie bei der Methode mit shell32.dll.

Hier zwei Beispielskripte zur Lösung Deiner Aufgabe.

Zuerst das Skript, das vom Stick gestartet werden soll, die Vorbereitungen macht und dann die ServerSetup.bat startet:
@echo off

setlocal

set "HomeDir=%~dp0"  
if "%HomeDir:~-1%" neq "\" set "HomeDir=%HomeDir%\"  

cd /d "%HomeDir%"  

:: Mach irgendwas...

copy "ServerSetup.bat" "%USERPROFILE%" > NUL  
cmd /c "call "%USERPROFILE%\ServerSetup.bat" "%HomeDir%""  

endlocal

Die ServerSetup.bat:
@echo off

setlocal

set "HomeDir=%~dp0"  

set "StickDrive=%~d1"  
set "StickDir=%~1"  

cd /d "%HomeDir%"  

"%StickDir%RemoveDrive" %StickDrive% -L -W:1000  

:: Mach irgendwas...

del ServerSetup.bat

endlocal

Das erste Skript, die ServerSetup.bat und RemoveDrive.exe müssen im selben Verzeichnis abgelegt sein. Das kann aber auch ein beliebiges Unterverzeichnis sein. Durch Zeile 5 wird das Verzeichnis ermittelt, in dem das Skript gespeichert ist. In Zeile 6 wird ein Backslash an den Pfad gehängt, wenn das Verzeichnis nicht das Wurzelverzeichnis ist. Dadurch hat HomeDir in allen Fällen ein einheitliches Format. In Zeile 8 wird in das Verzeichnis gewechselt, in dem die Dateien gespeichert sind. Durch den Parameter /D des CD-Befehls wird bei Bedarf auch direkt das aktuelle Laufwerk gewechselt. In Zeile12 wird die ServerSetup.bat auf die Festplatte kopiert (hier ins Benutzerprofil). Die Statusmeldung über den Erfolg der Kopieraktion wird durch >NUL unterdrückt. In Zeile 13 wird die ServerSetup.bat in einer separaten Instanz von CMD.exe gestartet. Als Parameter wird das Verzeichnis, in dem die Dateien auf dem USB-Stick gespeichert sind, übergeben.

In der ServerSetup.bat wird in Zeile 5 wieder das Verzeichnis ermittelt, in dem das Skript gespeichert ist. In Zeile 7 wird aus dem übergebenen Parameter der Laufwerksbuchstabe des USB-Sticks ermittelt. In Zeile 10 wird das aktuelle Verzeichnis auf den Pfad, unter dem die ServerSetup.bat gespeichert ist, gesetzt. Der Parameter /D des CD-Befehls sorgt dafür, das bei Bedarf auch direkt das Laufwerk gewechselt wird. In Zeile 12 wird RemoveDrive vom USB-Stick ausgeführt und damit der Stick ausgeworfen. Der Parameter -L sorgt dafür, das so lange versucht wird, den Stick auszuwerfen, bis die Aktion erfolgreich war. -W:1000 wartet 1000 ms bis zur Programmbeendigung. In Zeile 16 entfernt sich die ServerSetup.bat selbst vom System, deshalb darf nach dem DEL-Befehl kein relevanter Code mehr stehen.

RemoveDrive muss vom Stick, der ausgeworfen werden soll, ausgeführt werden. Es ist für Windows 2000 bis Windows 7 geeignet und existiert in einer 32Bit- und einer 64Bit-Version. Die Prozessorarchitektur des Hostsystems lässt sich über die Systemvariable PROCESSOR_ARCHITECTURE abfragen; für 32Bit-Systeme hat sie den Wert x86.

Gruß
Friemler