dynamische Gui mit Checkboxen / Service Installer für Vmware Workstation

  • So ich ermittel mit _GetFileList($DIR, $FILEMASK, 1) die Dateien mit Pfad und Anzahl.

    Nun versuche ich diese in einer Gui mit Checkboxen unterzubringen.

    Also muss Grösse und Position dynamisch sein, und der Name einedeutig weil ich ja hinter prüfen will was angehakt wurde.


    [autoit]


    $Daten = _GetFileList("D:\Eigene Dateien\My Virtual Machines", "*.vmx")
    GuiCreate("MyGUI", 392, 242,-1, -1 , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
    $info = GuiCtrlCreateLabel("Diese VMwares wurden in dem ausgewählten Pfad gefunden," & @CRLF & "weitere Maschinen können manuell hinzugefügt werden.", 30, 20, 330, 30)
    $Generate = GuiCtrlCreateButton("OK", 310, 70, 50, 40)
    $Abbruch = GuiCtrlCreateButton("Ende", 310, 110, 50, 40)
    $Hilfe = GuiCtrlCreateButton("Hilfe", 310, 150, 50, 40)
    $j=80
    for $i = 1 to $Daten[0]
    $j=$j+20
    $vm[$i] = GuiCtrlCreateCheckbox($Daten[$i], 50, $j, 210, 20)
    Next

    [/autoit][autoit][/autoit][autoit]

    ;~ $vm_1 = GuiCtrlCreateCheckbox("vmware1", 50, 80, 210, 20)
    $Group_5 = GuiCtrlCreateGroup("", 30, 60, 250, $j+10)

    [/autoit]

    Die Gesamtgrösse des Fensters passt so noch nicht, aber erst al dies erledigen.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (20. April 2008 um 22:26)

  • So vllt:
    Dim $vm[$daten[0]+1]
    GUICtrlSetResizing(-1,$GUI_DOCKALL) nach jedes Control, sonst werden die beim Resize verschoben

    Und verwende doch
    #include <File.au3>
    $Daten = _FileListToArray(@DesktopDir, "*.*") ; Da muss deine Ordner hin :)

  • So Sinn und Zweck dieser Veranstaltung war ein Programm zu schreiben welches:

    a: einen Dienst hinzufügt um eine VMware Workstation automatisch (desktopunabhängig) zu starten

    ...ja ich weiß das der Server umsonst ist :)

    b: eine passende Config generiert

    c: den Dienst und Config wieder entfernt.

    Das ist dabei heraus gekommen, vieles wäre auch sicher leichter gegangen :)

    Zusätzlich benötigt werden die Tools instsrv.exe und srvany.exe sowie GetFileList.au3 von Jo.

    Ablauf wie folgt:

    Man kann einen Dienstnamen vergeben und muss den Container wo die VMwares liegen angeben.

    Falls der Pfad zum VMware Programmverzeichnis nicht gefunden wurde, geht automatisch ein Dialog zum Suchen auf.

    Drückt man nun auf Start wird entweder der Dialog zum Deinstallieren aufgerufen oder ohne Haken nach VMwares gesucht und angezeigt.

    In der nächsten Auswahl erzeugt man nur noch die Config.

    Die Hilfe ist evtl. etwas monoton ;)

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Charlie-Brown-2.ico
    #AutoIt3Wrapper_outfile=vmware-service.exe
    #AutoIt3Wrapper_Compression=4
    #AutoIt3Wrapper_Res_Comment=Tool zum Erstellen eines VMware-Autostart Dienstes für VMware Workstation
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.0
    #AutoIt3Wrapper_Res_LegalCopyright=Dietmar Rolfes
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.2.10.0
    Author: Dietmar Rolfes
    Script Function: VMware Maschine als Dienst einrichten
    #ce ----------------------------------------------------------------------------
    #include <GuiConstants.au3>
    #include<GetFileList.au3>
    $Service_Name="VMware-Autostart"
    $vm_dir="My Virtual Machines"
    $vm_prg_dir=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware Workstation", "InstallPath")
    If $vm_prg_dir="" then file_exe_open()
    If StringRight($vm_prg_dir,1) <> "\" Then $vm_prg_dir=$vm_prg_dir & "\"
    $scriptdir=@ScriptDir
    If StringRight(@ScriptDir,1) <> "\" Then $scriptdir=@ScriptDir & "\"
    gui_service() ;ProgrammStart bei erfolgreicher RegistrySuche
    Func file_exe_open() ;Suchdialog falls kein VMware Eintrag in der Registry gefunden wurde
    $vmexe=FileOpenDialog("Bitte die vmware.exe im Programme Verzeichnis auswählen.", @ProgramFilesDir, "(vmware.exe)",0)
    If @error Then
    MsgBox(4096,"Programmende","Es wurde keine Datei ausgewählt.")
    Exit
    Else
    $vm_prg_dir=StringTrimRight($vmexe,10)
    EndIf
    EndFunc
    Func gui_service() ;Startgui: Auswahl De- Installation
    GuiCreate("VM-Workstation als Dienst einrichten - Dietmar Rolfes", 381, 181,-1, -1);, BitOR($WS_OVERLAPPEDWINDOW), $WS_CLIPSIBLINGS)) ;Resize deaktiviert
    $Group1 = GuiCtrlCreateGroup("", 20, 15, 230, 65)
    $Label1 = GuiCtrlCreateLabel("Bitte vergeben Sie einen Dienstnamen.", 30, 30, 200, 20)
    $Label2 = GuiCtrlCreateLabel("Dienstname:", 30, 50, 80, 20)
    $Service = GUICtrlCreateInput($Service_Name, 100, 50, 110, 20)
    $Group2 = GuiCtrlCreateGroup("", 20, 75, 230, 65)
    $Label3 = GuiCtrlCreateLabel("Verzeichnis der VMware Maschinen:", 30, 90, 200, 20)
    $Search_VMDir = GuiCtrlCreateButton("...", 30, 110, 20, 20)
    $VMDir = GUICtrlCreateInput($vm_dir, 60, 110, 150, 20,$ES_READONLY)
    $Start = GuiCtrlCreateButton("Start", 280, 20, 60, 40)
    $Abbruch = GuiCtrlCreateButton("Abbruch", 280, 60, 60, 40)
    $Hilfe = GuiCtrlCreateButton("Hilfe", 280, 100, 60, 40)
    $rm_service = GuiCtrlCreateCheckbox("Vorhandenen Dienst entfernen?", 40, 150, 235, 20)
    GuiSetState()
    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $Start
    $Service_Name=GUICtrlRead($Service)
    If GUICtrlRead($rm_service)=1 Then
    rm_service()
    Else
    If GUICtrlRead($VMDir)="" Or GUICtrlRead($VMDir)="My Virtual Machines" Then
    MsgBox(0,"Achtung!","Es muss zuerst das VMware-Maschinen Verzeichnis ausgewählt werden")
    Else
    start()
    EndIf
    EndIf
    Case $msg = $Abbruch
    Exit
    Case $msg = $Hilfe
    hilfe()
    Case $msg = $Search_VMDir
    $vm_dir = FileSelectFolder("wo liegen die VMwares?", "")
    GUICtrlSetData ($VMDir, $vm_dir)
    Case Else
    EndSelect
    WEnd
    Exit
    EndFunc
    Func start() ;Files kopieren, Dienst erzeugen
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(36,"Weiter zum nächsten Schritt?","Möchten Sie nun den Dienst " & '"' & $Service_Name & '"' & " installieren?" & @CRLF & @CRLF & "Welche VMware Maschinen automatisch gestartet werden sollen," & @CRLF & "können Sie im nächsten Dialog auswählen.")
    Select
    Case $iMsgBoxAnswer = 6 ;Yes
    If Not FileExists($vm_prg_dir & "instsrv.exe") Then FileInstall("C:\Autoit\vmware_service\instsrv.exe", $vm_prg_dir & "instsrv.exe")
    If Not FileExists($vm_prg_dir & "srvany.exe") Then FileInstall("C:\Autoit\vmware_service\srvany.exe", $vm_prg_dir & "srvany.exe")
    Run('"' & $vm_prg_dir & "instsrv.exe" & '"' & ' "' & $Service_Name & '" ' & '"' & $vm_prg_dir & "srvany.exe" & '"', "", @SW_HIDE)
    RegWrite ( "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\" & $Service_Name & "\Parameters", "Application", "REG_SZ",'"' & $vm_prg_dir & $Service_Name & ".cmd" & '"')
    If FileExists($vm_prg_dir & $Service_Name & ".cmd") Then FileDelete($vm_prg_dir & $Service_Name & ".cmd")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM Configfile für VMware Dienst")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM start vmware.exe -x " & '"Pfad\Maschine1.vmx" ' & '"Pfad\Maschine2.vmx"' & " / Multitab")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM start vmware.exe -x " & '"Pfad\Maschine1.vmx"' & " / Multi-Window")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM start vmware.exe -x " & '"Pfad\Maschine2.vmx"' & " / Multi-Window")
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","REM ------------------------------------------------------------------------" & @CRLF)
    FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","set path=%path%," & $vm_prg_dir)
    vm_auswahl()
    Case $iMsgBoxAnswer = 7 ;No
    EndSelect
    EndFunc
    Func vm_auswahl() ;Anzeige-Gui der gefundenen VMwares mit Checkbox Auswahl
    DIM $Daten = _GetFileList($vm_dir, "*.vmx")
    Dim $vm[100]
    $h=200
    If $Daten[1] = "" Then no_input()
    If $Daten[0] > 1 Then $h=200+$Daten[0]*20
    GuiCreate("Hier können Sie die zu startenden Maschinen auswählen.", 520, $h,-1, -1); , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS)) ;Resize deaktiviert
    $info = GuiCtrlCreateLabel("Diese VMwares wurden in dem ausgewählten Pfad gefunden,weitere Maschinen können manuell hinzugefügt werden.", 30, 20, 330, 30)
    $j=60
    for $i = 1 to $Daten[0]
    $j=$j+20
    $vm[$i] = GuiCtrlCreateCheckbox(StringTrimLeft($Daten[$i],StringLen($vm_dir)), 50, $j, 435, 20)
    Next
    $Group_5 = GuiCtrlCreateGroup("", 30, 60, 460, $j-25)
    $single_window = GuiCtrlCreateCheckbox("Je virtuelle Maschine ein seperates Fenster?", 50, $j+45, 235, 20)
    $disable_hints = GuiCtrlCreateCheckbox("Für den Dienst Tips etc deaktivieren?", 50, $j+65, 235, 20)
    GUICtrlSetState($disable_hints,$GUI_CHECKED)
    $Generate = GuiCtrlCreateButton("OK", 320, $j+65, 50, 40)
    $Abbruch = GuiCtrlCreateButton("Ende", 370, $j+65, 50, 40)
    $Hilfe = GuiCtrlCreateButton("Hilfe", 420, $j+65, 50, 40)

    GuiSetState()
    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $Generate ;Config schreiben
    If GUICtrlRead($disable_hints)=1 Then no_hints()
    If GUICtrlRead($single_window)<>1 Then FileWrite($vm_prg_dir & $Service_Name & ".cmd","start vmware.exe -x ")
    For $k=1 to $Daten[0]
    If GUICtrlRead($single_window)<>1 Then
    If GUICtrlRead($vm[$k])= 1 Then FileWrite($vm_prg_dir & $Service_Name & ".cmd",'"' & $Daten[$k] & '" ')
    Else
    If GUICtrlRead($vm[$k])= 1 Then FileWriteLine($vm_prg_dir & $Service_Name & ".cmd","start vmware.exe -x " & '"' & $Daten[$k] & '"')
    EndIf
    Next
    MsgBox(0,"Installation abgeschlossen!","Testen sie einmal den Aufruf per Doppelklick." & @CRLF & @CRLF & "Beim ersten Dienststart müssen noch einmalig ein paar" & @CRLF & "Dialoge deaktiviert werden. (Updates,Tooltips,Floppy,etc)" & @CRLF & @CRLF & "Lassen Sie den Datenaustauch zwischen Dienst und Desktop zu." & @CRLF & "Aktivieren sie hierfür in den Eigenschaften des Dienstes," & @CRLF & "auf dem Reiter [Anmelden] die dazugehörige Checkbox." )
    If Not FileExists($vm_prg_dir & "service.jpg") Then FileInstall("C:\Autoit\vmware_service\service.jpg", $vm_prg_dir & "service.jpg")
    SplashImageOn("Bitte nicht vergessen den Dienst zu konfigurieren.",$vm_prg_dir & "service.jpg","634","551","-1","-1",2)
    Sleep(6000)
    SplashOff()
    Run('explorer.exe /select, "' & $vm_prg_dir & $Service_Name & ".cmd" &'"')
    Exit
    Case $msg = $Abbruch
    Exit
    Case $msg = $Hilfe
    hilfe()
    Case Else
    EndSelect
    WEnd
    Exit
    EndFunc
    Func rm_service() ;Anzeige-Gui für die bereits hinterlegten Dienste mit Checkbox Auswahl
    DIM $Inst_SRV = _GetFileList($vm_prg_dir, "*.cmd")
    Dim $vm[100]
    $h=200
    If $Inst_SRV[1] = "" Then no_input()
    If $Inst_SRV[0] > 1 Then $h=200+$Inst_SRV[0]*20
    GuiCreate("Nicht mehr benötigte Dienste entfernen.", 380, $h,-1, -1); , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS)) ;Resize deaktiviert
    $info = GuiCtrlCreateLabel("Folgende Dienste wurden gefunden und können entfernt werden:", 30, 20, 330, 30)
    $j=60
    for $i = 1 to $Inst_SRV[0]
    $j=$j+20
    $vm[$i] = GuiCtrlCreateCheckbox(StringTrimRight(StringTrimLeft($Inst_SRV[$i],StringLen($vm_prg_dir)),4), 50, $j, 280, 20)
    Next
    $Group_5 = GuiCtrlCreateGroup("", 30, 60, 320, $j-25)
    $single_window = GuiCtrlCreateCheckbox("Selektierte Dienste entfernen!", 50, $j+45, 235, 20)
    $Generate = GuiCtrlCreateButton("OK", 250, $j+65, 50, 40)
    $Abbruch = GuiCtrlCreateButton("Ende", 300, $j+65, 50, 40)

    GuiSetState()
    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $Generate
    If GUICtrlRead($single_window)=1 Then ;entfernen allgemein
    For $k=1 to $Inst_SRV[0]
    If GUICtrlRead($vm[$k])= 1 Then ;je Dienst
    RunWait("net stop" & '"' & StringTrimRight(StringTrimLeft($Inst_SRV[$k],StringLen($vm_prg_dir)),4) & '"', "", @SW_HIDE)
    Run('"' & $vm_prg_dir & "instsrv.exe" & '" "' & StringTrimRight(StringTrimLeft($Inst_SRV[$k],StringLen($vm_prg_dir)),4) & '"' & " remove", "", @SW_HIDE)
    FileDelete($Inst_SRV[$k])
    Else
    EndIf
    Next
    MsgBox(0,"De-Installation abgeschlossen!","Die ausgewählten Dienste wurden entfernt.")
    Exit
    Else
    MsgBox(0,"Achtung!","Dienste wirklich entfernen?")
    EndIf
    Case $msg = $Abbruch
    Exit
    Case Else
    EndSelect
    WEnd
    Exit
    EndFunc
    Func hilfe()
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(64,"Readme","Was soll ich hiermit?" & @CRLF & "Mit diesem Programm können Sie eine oder auch " & @CRLF & "mehrere virtuelle Maschinen als Dienst starten lassen." & @CRLF & @CRLF & "Was wird am System verändert?" & @CRLF & "Es wird ein neutraler Dienst hinzugefügt. Mit diesem starten " & @CRLF & "Sie ein CMD File in welchem die VMwares hinterlegt sind." & @CRLF & "Diese Datei ist mit einem Editor auch nachträglich editierbar." & @CRLF & @CRLF & "Welche Dateien benötige ich?" & @CRLF & "Die generierte Config-Datei und die beiden Dateien instsrv.exe und srvany.exe" & @CRLF & "werden in das VMware-Verzeichnis kopiert." & @CRLF & @CRLF & "Wenn die Maschinen nicht mehr automtisch starten sollen deaktivieren Sie den Dienst.",25)
    Select
    Case $iMsgBoxAnswer = -1 ;Timeout
    Case Else ;OK
    EndSelect
    EndFunc
    Func no_input()
    MsgBox(0,"Hinweis: Es gibt keine gültige Auswahl","Entweder wurden keine VMwares gefunden" & @CRLF & "oder kein Dienst der entfernt werden kann.")
    Exit
    EndFunc
    Func no_hints()
    $pref_ini=StringRegExpReplace(@AppDataCommonDir,"\A(.*\\).*(\\.*)\Z","$1LocalService$2") & "\VMware\preferences.ini"
    $build_nr=StringRight(FileGetVersion($vm_prg_dir & "vmware.exe", "ProductVersion"),5)
    FileWriteLine($pref_ini,'pref.eula.0.appName = "VMware Workstation"')
    FileWriteLine($pref_ini,'pref.eula.0.buildNumber = "' & $build_nr & '"')
    FileWriteLine($pref_ini,'pref.eula.size = "1"')
    FileWriteLine($pref_ini,'hint.guestos.xp = "FALSE"')
    FileWriteLine($pref_ini,'hint.keyboardHook.hookTimeout = "FALSE"')
    FileWriteLine($pref_ini,'hint.mks.hostAlphaCursor = "FALSE"')
    FileWriteLine($pref_ini,'hints.hideAll = "TRUE"')
    FileWriteLine($pref_ini,'pref.tip.startup = "FALSE"')
    FileWriteLine($pref_ini,'pref.tip.index = "1"')
    FileWriteLine($pref_ini,'webUpdate.checkLast = "1209077619"')
    EndFunc

    [/autoit]
  • So habe das Script und die Zip Datei mal upgedatet....

    So klappt es auch mit "solchen Dienst Namen" und "solchen Verzeichnissen" ;)

    Die Dienste lassen sich nun auch entfernen.

    2 Fragen habe ich noch, wie es z.B. andere lösen:

    [autoit]

    Func vm_auswahl() ;Anzeige-Gui der gefundenen VMwares mit Checkbox Auswahl
    DIM $Daten = _GetFileList($vm_dir, "*.vmx")
    Dim $vm[100]
    $h=200
    If $Daten[1] = "" Then no_input()
    If $Daten[0] > 1 Then $h=200+$Daten[0]*20
    GuiCreate("Hier können Sie die zu startenden Maschinen auswählen.", 520, $h,-1, -1); , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS)) ;Resize deaktiviert
    $info = GuiCtrlCreateLabel("Diese VMwares wurden in dem ausgewählten Pfad gefunden,weitere Maschinen können manuell hinzugefügt werden.", 30, 20, 330, 30)
    $j=60
    for $i = 1 to $Daten[0]
    $j=$j+20
    $vm[$i] = GuiCtrlCreateCheckbox(StringTrimLeft($Daten[$i],StringLen($vm_dir)), 50, $j, 435, 20)
    Next
    $Group_5 = GuiCtrlCreateGroup("", 30, 60, 460, $j-25)
    $single_window = GuiCtrlCreateCheckbox("Je virtuelle Maschine ein seperates Fenster?", 50, $j+45, 235, 20)
    $disable_hints = GuiCtrlCreateCheckbox("Für den Dienst Tips etc deaktivieren?", 50, $j+65, 235, 20)
    GUICtrlSetState($disable_hints,$GUI_CHECKED)
    $Generate = GuiCtrlCreateButton("OK", 320, $j+65, 50, 40)
    $Abbruch = GuiCtrlCreateButton("Ende", 370, $j+65, 50, 40)
    $Hilfe = GuiCtrlCreateButton("Hilfe", 420, $j+65, 50, 40)

    [/autoit]

    Gemeint ist die dynamische Anzahl der Checkboxen....

    [autoit]

    C:\Dokumente und Einstellungen\LocalService\Anwendungsdaten == [user='201377']????[/user]??

    [/autoit]

    Gibt es hier eine Lösung alla @DocumentsCommonDir , @DocumentsDir würde mir schon reichen :)

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (3. Mai 2008 um 03:08)

  • .

    [autoit]

    C:\Dokumente und Einstellungen\LocalService\Anwendungsdaten == [user='201377']????[/user]??

    [/autoit]

    Gibt es hier eine Lösung alla @DocumentsCommonDir , @DocumentsDir würde mir schon reichen :)

    Das ist denk mal schon besser:

    [autoit]

    StringRegExpReplace(@AppDataCommonDir,"\A(.*\\).*(\\.*)\Z","$1LocalService$2")

    [/autoit]