ovu-p86
Goto Top

Bat - VMware Dienste de- und aktivieren unter Berücksichtigung mehrerer VMs

Hallo,


hier ein Bat mit dem man die Dienste u. Netzwerkverbindungen von VM nur bei Bedarf einschaltet.
Hierzu kursieren ja eine Menge Beiträge im Netz.

Mein Problem war, daß wenn ich mehrere VMs laufen habe, und nur eine davon beende mir die Dienste
auch für die noch laufenden VMs beendet wurde.

Deshalb hier eine Erweiterung der kursierenden Beiträge um die Abfrage ob noch eine VM läuft.

Der Bat-File läßt sich sicher eleganter schreiben, (Hab z.B. auf eine zusätzliche Abfrage ob die Dienste
schon laufen verzichtet, ist aber unschädlich) funktioniert aber.

Das Ganze ist so angelegt, daß ich den Bat + devcon.exe in ein Verzeichnis kopiere. (Ist dann universeller,
kann man dann mitnehmen auf Rechner wo kein devcon existiert)

Aufruf
vmstart.bat "Lfw:\dein Pfad\deine VM.vmx"

vmstart.bat:

@echo off
rem __________ CMD-ProgrPfad festlegen (Ausgabe mit \)
set progrpfad=%~dp0
rem __________ devcon festlegen (devcon wurde vorher mit ins Verz. kopiert)
set devcon=%progrpfad%devcon.exe

:start
rem  Abfrage ob Netzwerkverbindung VMnet1 + 8 aktiviert, werden ggf. eingeschaltet
rem --------------------------------------------------------------------------------------------------------------
"%devcon%" status @ROOT\VMWARE\0000 | find /I /C "running" >"%progrpfad%temp.txt"  
for /F "usebackq" %%i in ("%progrpfad%temp.txt") do if %%i EQU 0 "%devcon%" enable @ROOT\VMWARE\0000  
del "%progrpfad%temp.txt"  
"%devcon%" status @ROOT\VMWARE\0001 | find /I /C "running" >"%progrpfad%temp.txt"  
for /F "usebackq" %%i in ("%progrpfad%temp.txt") do if %%i EQU 0 "%devcon%" enable @ROOT\VMWARE\0001  
del "%progrpfad%temp.txt"  

net start VMnetDHCP
net start "VMware NAT Service"  
net start VMUSBArbService
start /WAIT "" %1  


:beenden
rem pruefen ob noch eine VM laueft, wenn ja Abbruch
rem ----------------------------------------------------------------
tasklist | find /I /C "vmplayer.exe" > "%progrpfad%temp.txt"  
for /F "usebackq" %%i in ("%progrpfad%temp.txt") do if %%i NEQ 0 goto vmaktiv  
del "%progrpfad%temp.txt"  

net stop VMnetDHCP
net stop "VMware NAT Service"  
net stop VMUSBArbService

"%devcon%" disable @ROOT\VMWARE\0000  
"%devcon%" disable @ROOT\VMWARE\0001  
goto ende

:vmaktiv
del "%progrpfad%temp.txt"  

:ende
set progrpfad=
set devcon=
exit


Ergebnis:
Wenn ich eine Testumgebung mit bspw. 3 VMs laufen habe und eine davon beende, bleiben die
Netzwerkverbindungen und Dienste bestehen. Erst wenn ich die letzte VM beende werden auch
die Netzwerkverbindungen und Dienste deaktiviert.

Viel Spaß, wie gesagt geht wahrscheinlich eleganter, aber funktioniert gut.


Gruß
Uwe


++++++++++++++++++++ Update ++++++++++++++++++++++

Zum Ende des Beitrags ist eine aktualisierte Version.
-> Bat - VMware Dienste de- und aktivieren unter Berücksichtigung mehrerer VMs

Mit eingedampften, übersichtlicherem Code.
Einfacher zum Anpassen an eigene Bedingungen

Update ++++++++++++++++++++++


Content-Key: 164357

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: bastla
bastla Apr 11, 2011 at 15:31:02 (UTC)
Goto Top
Hallo ovu-p86!

Etwas verschlankt, dafür aber ungetestet:
@echo off & setlocal
rem __________ devcon festlegen (devcon wurde vorher mit ins Verz. kopiert)
set devcon="%~dp0devcon.exe"  
rem __________ Verbindungen festlegen
set "Verb=0000 0001"  

rem  Abfrage ob Netzwerkverbindungen aktiviert, werden ggf. eingeschaltet
rem --------------------------------------------------------------------------------------------------------------
for %%a in (%Verb%) do
    for /f %%i in ('%devcon% status @ROOT\VMWARE\%%a^|find /I /C "running"') do if %%i==0 %devcon% enable @ROOT\VMWARE\%%a  
)

net start VMnetDHCP
net start "VMware NAT Service"  
net start VMUSBArbService
start /WAIT "" %1  

rem pruefen ob noch eine VM laueft, wenn ja Abbruch
rem ----------------------------------------------------------------
for /f %%i in ('tasklist^| find /I /C "vmplayer.exe"') do if %%i NEQ 0 goto :eof  

net stop VMnetDHCP
net stop "VMware NAT Service"  
net stop VMUSBArbService

for %%a in (%Verb%) do %devcon% disable @ROOT\VMWARE\%%a
Grüße
bastla
Member: Biber
Biber Apr 11, 2011 at 15:36:28 (UTC)
Goto Top
[OT]@bastla
Zitat von @bastla:

Etwas verschlankt, dafür aber ungetestet:

Du verschlankt, der Batch ungetestet?
Nur noch 12 Tage und der Rest von heute bis zum Ende der Fastenzeit... face-wink
[/OT]
@ovu-p86

Vielen Dank für das Bereitstellen deines Schnipsels.

Grüße
Biber
Mitglied: 99045
99045 Apr 11, 2011 at 15:45:52 (UTC)
Goto Top
Hi,
schönes Teil.

Da du dich ja mit dem Batchen wohl häufiger beschäftigst, eine kleine Anmerkung:
Zur Unterscheidung von Uralt-Stapelverarbeitungsdinges, die überlicherweise alle .bat benamst waren, würde ich neuere Versionen, die grundsätzlich nur unter
NT-Systemen laufen, nur noch mit der Endung .cmd versehen. Dann meine ich (aber nur als Empfehlung), dass man Variablen nicht nach vonhandenen Programmen oder
internen Befehlen benennen sollte.

Und wenn du dann in der Zeile 20 den Start-Befehl mit dem ""-Parameter für den Titel vor das /WAIT rückst, (so wie gestern beschrieben), hast du eine weitere mögliche Fehlerquelle einfach eliminiert.

Gruß
Member: bastla
bastla Apr 11, 2011 at 16:36:22 (UTC)
Goto Top
[OT] @Biber
Du verschlankt
Belieben zu scherzen? Das tu ich höchstens mal einem wehrlosen Bach an ... face-wink

Grüße
bastla

P.S.: "Fastenzeit" fällt bei mir unter "Folklore" - und is daher nix für mich ...
[/OT]
Member: ovu-p86
ovu-p86 Apr 12, 2011 at 15:17:52 (UTC)
Goto Top
Hallo bastla,

danke für die Anregungen.

Der Script funktioniert so allerdings nicht komplett..
Insbesondere deine Zeile 9-10.

Hab aber deine Zeile 20 bei mir mit aufgenommen.

Das heißt: in meinem Script Zeile 26-28 gelöscht
und ersetzt durch
for /f %%i in ('tasklist^| find /I /C "vmplayer.exe"') do if %%i NEQ 0 goto ende  
sowie Zeilen 38-39 gelöscht.
Funktioniert.

Ich find solche Anregungen immer klasse, lernt man viel bei. Wenn Zeit werde ich noch mal
versuchen deine Zeilen 9-10 einzubinden.

Aber wie gesagt der am Anfang eingestellte Script funktioniert. Ist halt etwas länger.
Deshalb hau ich hier nicht noch mal den kompletten, modifizierten Script rein.

Dank.

Gruß
Uwe
Member: bastla
bastla Apr 12, 2011 at 15:22:09 (UTC)
Goto Top
Hallo ovu-p86!
Der Script funktioniert so allerdings nicht komplett..
Insbesondere deine Zeile 9-10.
Wenn Du vorübergehend aus dem "echo off" am Anfang ein "echo on" machst, kannst Du ja sehen, wo's klemmt ...

Grüße
bastla
Member: ovu-p86
ovu-p86 Apr 12, 2011 at 15:40:59 (UTC)
Goto Top
Hallo bastla,

hab ich gemacht.

Um weitere Fehlerquellen wegzulassen, hab ich auch zunächst das 1. for für Verb weggelassen und händisch eingegeben.

for /f %%i in ('%devcon% status @ROOT\VMWARE\0000^|find /I /C "running"') do if %%i==0 %devcon% enable @ROOT\VMWARE\0000  

wurde dann nicht richtig interpretiert. Habs auch mit "usebackq" probiert, u.s.w. z.T. wurde es nicht als Befehl interpretiert
oder %devcon% wurde entweder mit doppelten "" interpretiert oder im Pfad abgeschnitten.
Aber da fummle ich mich noch mal durch.

Gruß
Uwe
Member: bastla
bastla Apr 12, 2011 at 15:47:12 (UTC)
Goto Top
Hallo ovu-p86!

Aufgrund meiner Zeile 3 müsste in %devcon% der vollständige Pfad (ausnahmsweise) bereits unter Anführungszeichen stehen ...

Grüße
bastla
Member: ovu-p86
ovu-p86 Apr 12, 2011 at 16:52:45 (UTC)
Goto Top
Hallo bastla,

hab ich gemacht. Um zu testen, hab ich nur den Rumpf genommen, der mich interessiert.

Also:
@echo on
set devcon="%~dp0devcon.exe"  
for /f %%i in ('%devcon% status @ROOT\VMWARE\0000^|find /I /C "running"') do if %%i==0 %devcon% enable @ROOT\VMWARE\0000  
pause
set devcon=

Ergebnis:
D:\Eigene Dateien\test>set devcon="D:\Eigene Dateien\test\devcon.exe"  

D:\Eigene Dateien\test>for /F %i in ('"D:\Eigene Dateien\test\devcon.exe" status @ROOT\VMWARE\0000|find /I /C "running"') do if %i == 0 "D:\Eigene Dateien\test\devcon.exe" enable @ROOT\VMWARE\0000  
Der Befehl "D:\Eigene" ist entweder falsch geschrieben oder konnte nicht gefunden werden.  

D:\Eigene Dateien\test>pause
Drücken Sie eine beliebige Taste . . .

Aber ich will nicht nerven, hast sicher interessantere Probleme zu lösen.
Mich macht sowas immer irre. Muß ich irgendwie noch hinkriegen.

Gruß
Uwe
Member: bastla
bastla Apr 12, 2011 at 17:15:38 (UTC)
Goto Top
Hallo ovu-p86!

Dann vielleicht so:
for /f %%i in ('call %devcon% status @ROOT\VMWARE\0000^|find /I /C "running"') do if %%i==0 %devcon% enable @ROOT\VMWARE\0000
Grüße
bastla
Member: ovu-p86
ovu-p86 Apr 12, 2011 at 17:21:56 (UTC)
Goto Top
Hallo bastla,

funktioniert. !!!!!

Danke

Gruß
Uwe
Member: DerWoWusste
DerWoWusste Apr 12, 2011 at 20:25:47 (UTC)
Goto Top
Moin.
Mal nebenbei gefragt:
Mein Problem war, daß wenn ich mehrere VMs laufen habe, und nur eine davon beende mir die Dienste auch für die noch laufenden VMs beendet wurde.
Hab ich noch nie gehört - wer kennt dies Problem außer Dir?
Member: ovu-p86
ovu-p86 Apr 12, 2011 at 21:29:55 (UTC)
Goto Top
Hallo DerWoWusste,

vielleicht mißverständlich ausgedrückt.

"Mein Problem war, daß wenn ich mehrere VMs laufen habe, und nur eine davon beende mir die Dienste
auch für die noch laufenden VMs beendet wurde.

Deshalb hier eine Erweiterung der kursierenden Beiträge um die Abfrage ob noch eine VM läuft."



Soll heißen:

Standardmäßig sind ja die ganzen Dienste eingeschaltet. Will man ja nicht, wenn man die VM gerade nicht nutzt.

Deshalb haben ja die Nutzer in den vielen kursierenden Beiträgen Scripte geschrieben,
die die VM über einen cmd aufrufen der im Prinzip so funktioniert:
net start - start /wait VM-Aufruf - net stop


Wenn ich mehrere VMs für eine Testumgebung aufrufe passiert folgendes:
1.VM -> net start - start / Wait VM1-Aufruf
2.VM -> net start - start / Wait VM2-Aufruf
3.VM -> net start - start / Wait VM3-Aufruf
(das mehrfache "net start" ist unschädlich)

Wenn ich jetzt z.B. die 3.VM schließe kommt
3.VM -> net stop

die 1. u. 2. VM haben den Dienst jetzt nicht mehr.
Und das war mein Problem.

Deshalb hab ich das hier um die Abfrage ergänzt, ob noch eine VM aktiv ist. Wenn ja wird der Dienst nicht
beendet. Ich kann mit den verbleibenden 2 VMs normal weiterarbeiten. Erst wenn ich die letzte VM schließe
werden die Dienste und VMnet1+8 beendet.

Nichts weltbewegendes, aber nützlich, wenn man eine Testumgebung mit mehreren VMs hat.


Gruß
Uwe
Member: ovu-p86
ovu-p86 Apr 13, 2011 at 00:41:27 (UTC)
Goto Top
Hallo,

++++++++++ Update +++++++++++

hier nochmal eine Code-eingedampfte Version, die auch universeller zu nutzen ist.
Hab die Anregungen von "bastla" und "Kaputtnick" berücksicht bzw. eingebaut.

Das Ganze ist nach wie vor so angelegt, daß man den cmd + devcon.exe in ein beliebiges Verzeichnis kopiert.
(Ist dann universeller,kann man dann mitnehmen auf Rechner wo kein devcon existiert)

Der cmd ist jetzt kürzer, übersichtlicher angelegt und läßt sich einfacher an eigene Gegegenheiten anpassen.

Zum Anpassen, am Anfang unter :setting bei Bedarf die gewünschten Dienste und Netzwerkverbindungen sowie
den VMware-Prozeß editieren. Fertig.


vmstart.cmd

@echo off
rem ______________________________________________________________________________________________________
rem -  VMware Dienste + Netzwerkverbindungen de- und aktivieren unter Beruecksichtigung mehrerer VMs
rem ---------------------------------------------------------------------------------------------------
rem -  Diesen cmd und devcon.exe vorher in ein beliebiges Verzeichnis kopieren und von dort aufrufen
rem -
rem -  Aufruf: vmstart.cmd "Lfw:\dein Pfad\deine VM.vmx"  
rem -  Also Verknuepfung zum vmstart.cmd erstellen und dann im Link ZIEL um "Lfw:\dein Pfad\deine VM.vmx"   
rem -  ergaenzen. Zusaetzlich AUSFUEHREN "minimiert" im Link einstellen.  
rem ______________________________________________________________________________________________________

:setting
rem ++++++++ gewuenschte Dienste hier festlegen, Liste bei Bedarf ergaenzen ++++++++++++++++++++++++
set dienste=VMnetDHCP "VMware NAT Service" VMUSBArbService  

rem ++++++++ gewuenschte Netwerkverbindungen hier festlegen, Liste bei Bedarf ergaenzen +++++++++++++
set "Verb=ROOT\VMWARE\0000 ROOT\VMWARE\0001"  

rem ++++++++ Prozessname der VMware, bei Bedarf aendern +++++++++++++++++++++++++++++++++++++++++++++
set vm=vmplayer.exe


:start
set _devcon="%~dp0devcon.exe"  
rem hier Abfrage ob Netzwerkverbindung aktiviert, wird ggf. eingeschaltet
rem ---------------------------------------------------------------------
for %%a in (%Verb%) do (for /f %%i in ('call %_devcon% status @%%a^|find /I /C "running"') do if %%i==0 %_devcon% enable @%%a)  

for %%a in (%dienste%) do net start %%a
start /WAIT "" %1  

:beenden
rem pruefen ob noch eine VM laueft, wenn ja Fehler
rem ----------------------------------------------
for /f %%i in ('tasklist^| find /I /C "%vm%"') do if %%i NEQ 0 goto ende  

for %%a in (%dienste%) do net stop %%a
for %%a in (%Verb%) do %_devcon% disable @%%a

:ende
set _devcon=
set dienste=
set Verb=
set vm=
exit

(Ist in einer Umgebung mit mehreren 3 VMs getestet und funktioniert)

Dank noch mal an "bastla" und "Kaputtnick". Hab ne Menge gelernt.
Was mich vor allem gestört hatte, war meine Steinzeit-Abfrage-Umleitung in eine .txt Datei.
Hatte zwar alles funktioniert aber trotzdem.
Jetzt reichts aber erst mal.


Gruß
Uwe
Member: miniversum
miniversum Apr 15, 2011 at 13:13:03 (UTC)
Goto Top
Was du noch etwas vereinfachen kannst ist:
for /f %%i in ('tasklist^| find /I /C "%vm%"') do if %%i NEQ 0 goto ende
zu
tasklist^| find /I /C "%vm%" >NUL 2>NUL && goto ende
Member: ovu-p86
ovu-p86 Apr 21, 2011 at 22:41:46 (UTC)
Goto Top
Hallo miniversum,

danke für den Hinweis. Ist ja immer eine Herausforderung. Man lernt bei.

Hab das mal ersetzt.. Funktioniert leider so nicht in dem cmd. Worans liegt?
Ich laß das jetzt erstmal wie im +++ Update +++. Das funktioniert.

Gruß
Uwe
Member: miniversum
miniversum Apr 22, 2011 at 08:40:19 (UTC)
Goto Top
Ach.. sorry. mein fehler. Das ist ja ein NEQ, dann so:
Mitglied: 99045
99045 Apr 22, 2011 at 09:53:16 (UTC)
Goto Top
Hi,

eigentlich müsste ja ein
tasklist | find /I /C "%vm%" >NUL 2>NUL || exit

reichen, denn wenn man die 1. Zeile so abändert
@echo off & setlocal

ist das, was in :ende steht, überflüssig.

Bei mir liegt übrigens in allen Verzeichnissen der devinierten VMs eine *.lck-Datei mit 0 Byte, sobald eine Maschine gestartet ist. Wenn man das überprüft, wäre eigentlich dieses Script überflüssig.

Zum Steuern von Diensten gibt es übrigens das Dienstprogramm SC.

Gruß
Hotly discussed
gleixnerdCheck of ZFW Firewallgleixnerd - 3 CommentsAlexWishaHow to set up and configure a Linux GRE tunnelAlexWisha - 3 CommentsjstrickerWIREGUARD VPN ON UDM PRO BEHIND FRITZBOX - HANDSHAKE DID NOT COMPLETEjstricker - 3 CommentsDaniEnd of Support dates for Office 2016, 2019 Apps und Productivity ServersDani - 1 Comment