javip Posted July 1, 2013 Posted July 1, 2013 so my script was made to load drivers based on a selection from a combo box. i've created a VERY robust system to load drivers when imaging with wds or ghost using a winPE wim. WDS does not work correctly with injected drivers. so comes into play my script/program that loads from a winPE wim after wds loads. anyone knows WDS is pretty powerful but it does not always have proper drivers once the winPE loads. so my program loads drivers into winPE based on the model / device. so if we get a new model of laptop or desktop and we want to save up that image to wds we find 32bit drivers and we load them into my program. wds then in turn loads my winPE with my program set to autolaunch and presenting all these options. if winPE contained a generic driver then all is good. if not then we go through my list and usually one of the drivers does work but in case it doesn't we add to my list. that's just the pre-amble incase anyone asks what i'm doing. reminder that this has worked flawlessly for the better part of a year. but now with more devices it's getting cumbersome to manually edit my code, then compile, then mount edit and recompile the winPE wim and inject my autoit program into it. takes a maximum of 5 minutes but when you're constantly testing it gets VERY bad. here's a snippet of the array for the combobox. Local $aList[300][2] = [["___________", "___________"], _ ["ASUS", "ASUS"], _ ["HP Probook 4430s", "HP Probook 4430s"], _ ["Lenovo S10-3", "Lenovo S10-3"], _ ["Lenovo x200/x230", "Lenovo x200/x230"], _ so this populates a combo box that lists these entries. i use a case select to determine which box was selected. very manual editing when i need to add another device. Func selection() $sSel = GUICtrlRead($cb_platform) $iIndex = _ArraySearch($aList, $sSel) Select Case $iIndex = 1 ;~ ASUS $driver = (@scriptdir & "\drivers\hp32\Netrtl32.inf") $nothing = $option Case $iIndex = 2 ;~ HP Probook 4430s $driver = (@scriptdir & "\drivers\hp4430\hp86win7.inf") $nothing = $option Case $iIndex = 3 ;~ Lenovo S10-3 $driver = (@scriptdir & "\drivers\lenovos103\Netrtl32.inf") $nothing = $option EndFunc this is the part of the script which i'm trying to revamp. right now my script works very awesome for what we're doing. however i want it more streamlined. as you can see once a combobox selection is selected, then it goes to that CASE and populates those variables then it kicks down to a function that i have that continues either ghost or wds depending on a selected radio box. this is what i have now for the array for the combobox. $drivers_folder=_FileListToArray(@scriptdir & "\drivers\","*",2) $cb_platform = GUICtrlCreateCombo("",10,40,600,120,-1,-1) For $i=1 To Ubound($drivers_folder)-1 GUICtrlSetData($cb_platform,$drivers_folder[$i]) Next this populates the combox based on the folder i have with each individual device. instead of creating a long winded array. the problem i have now is i don't know how to make it load the driver within that folder without a case select. i was thinking maybe something that got the name of the folder selected, then appended a "*.inf" at the end to load. but i'm totally in the dark of how to do this. if you'd like me to post all my code to help, please let me know.
FireFox Posted July 1, 2013 Posted July 1, 2013 (edited) Hi,What about this kind of array?Local $aList[300][3] = _ ["ASUS", "ASUS", "hp32\Netrtl32.inf"], _ ["HP Probook 4430s", "HP Probook 4430s", "hp4430\hp86win7.inf"], _ ["Lenovo S10-3", "Lenovo S10-3", "lenovos103\Netrtl32.inf"]] ... $driver = @ScriptDir & "\drivers\" & $aList[$iIndex][2]Edit: Added indents.Br, FireFox. Edited July 1, 2013 by FireFox
javip Posted July 1, 2013 Author Posted July 1, 2013 (edited) well the thing is i don't want to use that kind of array. manual editing. the way i want to do it is the new way where it pulls the directory listing. so to add a new driver to my program all i need to do is drop the new device folder into the drivers folder. then when the program is launched the new folder is there in the combobox. each driver folder is independent and containts only one .inf for that device. so using a *.inf wildcard to load it wouldn't hurt anything. Edited July 1, 2013 by pixeldotz
FireFox Posted July 1, 2013 Posted July 1, 2013 If you don't want to have an array, these informations have to be stored somewhere. Maybe in an ini in each driver's folder or in the inf files.Br, FireFox.
jdelaney Posted July 1, 2013 Posted July 1, 2013 How about: #include <GUIConstantsEx.au3> #include <array.au3> $sDir = @scriptdir & "\driver" $aFolders = _FileListToArray($sDir,"*",2) _ArrayDelete($aFolders,0) $string = _ArrayToString($aFolders) Local $msg GUICreate("My GUI combo") ; will create a dialog box that when displayed is centered $combo = GUICtrlCreateCombo("", 10, 10) ; create first item GUICtrlSetData(-1, $string) ; add other item snd set a new default GUISetState() ; Run the GUI until the dialog is closed While 1 $msg = GUIGetMsg() If $msg = $combo Then $Folder = GUICtrlRead($combo) $sINFFolder = $sDir & "\" & $Folder $aTemp = _FileListToArray( $sINFFolder, "*.inf",1) If UBound($aTemp)=2 Then ; Get the driver ConsoleWrite("your driver=[" & $sINFFolder & "\" & $aTemp[1] & "]" & @CRLF) Else ConsoleWrite("no driver, or multiple drivers, in=[" & $sINFFolder & "\" & "]" & @CRLF) EndIf $aTemp = "" EndIf If $msg = $GUI_EVENT_CLOSE Then ExitLoop WEnd IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
javip Posted July 1, 2013 Author Posted July 1, 2013 that would be fine too since it would require editing only one external file instead of adding everything and recompiling. this would also keep everything nice and in alphabetical order. how would i go about doing that? i've never done a split or loaded from an inf file.
FireFox Posted July 1, 2013 Posted July 1, 2013 Take a look at the Ini* functions, it's really simple
javip Posted July 1, 2013 Author Posted July 1, 2013 i got it to read using this little code. $cbox = IniReadSection("device.ini","Config") For $i = 1 To $cbox[0][0] GUICtrlSetData($cb_platform,$cbox[$i][1]) Next EndIf this populates the combobox beautifully. now i'm stuck on the case part. i can do another IniReadSection into another array but how would that work to call my functions? or rather how would that work at all. i'm stumped.
FireFox Posted July 2, 2013 Posted July 2, 2013 You can populate an array according to your ini file :[drivers] name1=ASUS displayname1=ASUS path1=hp32\Netrtl32.inf name2=HP Probook 4430s displayname2=HP Probook 4430s path2=hp4430\hp86win7.infThere is for sure a better structure way for the ini, but the idea is here.Br, FireFox.
jdelaney Posted July 2, 2013 Posted July 2, 2013 If you had a section ([section]) for each driver folder, then you could key off the combobox selection to drive the INI reading as well. IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
javip Posted July 2, 2013 Author Posted July 2, 2013 that displays the name and the path in the 'path' thing. what i was thinking of was something like this. [device] name1=ASUS name2=HP Probook 4430s [drivers] path1=(@scriptdir & "AsusNetrtl32.inf") path2=(@scriptdir & "hp4430hp86win7.inf) so when i select ASUS i want it to also select path1 and if i select HP i want it to select path2 etc. then put that as a variable in $driver = WHATEVER WAS SELECTED $nothing = $option im totally stumped on this second part.
jdelaney Posted July 2, 2013 Posted July 2, 2013 (edited) less logic if it looked like this...loop through IniReadSectionNames: [Case1] name=ASUS path=(@scriptdir & "AsusNetrtl32.inf") [Case2] name=HP Probook 4430s path=(@scriptdir & "hp4430hp86win7.inf) Edited July 2, 2013 by jdelaney IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
jdelaney Posted July 2, 2013 Posted July 2, 2013 (edited) try this...not doing any action, just populating data, for now: expandcollapse popup#include <GUIConstantsEx.au3> #include <ButtonConstants.au3> #include <array.au3> $sDir = @scriptdir & "\driver" $aFolders = _FileListToArray($sDir,"*",2) _ArrayDelete($aFolders,0) $string = _ArrayToString($aFolders) Local $msg $gui = GUICreate("My GUI combo") ; will create a dialog box that when displayed is centered $combo = GUICtrlCreateCombo("", 10, 10) ; create first item GUICtrlSetData(-1, $string) ; add other item snd set a new default $aPos = WinGetPos($gui) Global $button = GUICtrlCreateButton("Start",10,$aPos[3]-80, 50, 40,$BS_DEFPUSHBUTTON) GUICtrlSetState($button,$GUI_DISABLE) GUISetState() $aDrivers="" $driver = "" ; Run the GUI until the dialog is closed While 1 $msg = GUIGetMsg() Select Case $msg = $combo $Folder = GUICtrlRead($combo) $sINFFolder = $sDir & "\" & $Folder $aTemp = _FileListToArray( $sINFFolder, "*.inf",1) If UBound($aTemp)=2 Then ; Get the driver ConsoleWrite("your driver=[" & $sINFFolder & "\" & $aTemp[1] & "]" & @CRLF) $aDrivers = CreateDriverControls($aDrivers, $sINFFolder & "\" & $aTemp[1]) Else ConsoleWrite("no driver, or multiple drivers, in=[" & $sINFFolder & "\" & "]" & @CRLF) EndIf Case $msg = $button ConsoleWrite("Do something with driver=[" & $driver & "]." & @CRLF) Case _ArraySearch($aDrivers,$msg,0,0,0,0,1,0)>0 $driver=$aDrivers[_ArraySearch($aDrivers,$msg,0,0,0,0,1,0)][1] ConsoleWrite("changed radio selection to=[" & $driver & "]." & @CRLF) If Not BitAND(GUICtrlGetState($button),$GUI_ENABLE) Then GUICtrlSetState($button,$GUI_ENABLE) EndSelect If $msg = $GUI_EVENT_CLOSE Then ExitLoop WEnd Func CreateDriverControls ($aDrivers, $sINIFile) If BitAND(GUICtrlGetState($button),$GUI_ENABLE) Then GUICtrlSetState($button,$GUI_DISABLE) For $i = 0 To UBound($aDrivers) - 1 For $j = 0 To UBound($aDrivers,2) - 1 GUICtrlDelete($aDrivers[$i][$j]) Next Next $aTemp = IniReadSection($sINIFile, "device") $aTemp2 = IniReadSection($sINIFile, "drivers") $iStart = 40 $iControlHeight = 20 $iControlSpacing = 10 For $i = 1 To UBound($aTemp)-1 $aTemp[$i][0] = GUICtrlCreateRadio($aTemp[$i][1], $iControlSpacing,$iStart+($iControlSpacing*$i)+($iControlHeight*$i), 100 ) $aTemp2[$i][1] = GUICtrlCreateEdit($aTemp2[$i][1], 100+$iControlSpacing,$iStart+($iControlSpacing*$i)+($iControlHeight*$i), 250 ) Next Return $aTemp EndFunc Edited July 2, 2013 by jdelaney IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
javip Posted July 3, 2013 Author Posted July 3, 2013 try this...not doing any action, just populating data, for now: expandcollapse popup#include <GUIConstantsEx.au3> #include <ButtonConstants.au3> #include <array.au3> $sDir = @scriptdir & "\driver" $aFolders = _FileListToArray($sDir,"*",2) _ArrayDelete($aFolders,0) $string = _ArrayToString($aFolders) Local $msg $gui = GUICreate("My GUI combo") ; will create a dialog box that when displayed is centered $combo = GUICtrlCreateCombo("", 10, 10) ; create first item GUICtrlSetData(-1, $string) ; add other item snd set a new default $aPos = WinGetPos($gui) Global $button = GUICtrlCreateButton("Start",10,$aPos[3]-80, 50, 40,$BS_DEFPUSHBUTTON) GUICtrlSetState($button,$GUI_DISABLE) GUISetState() $aDrivers="" $driver = "" ; Run the GUI until the dialog is closed While 1 $msg = GUIGetMsg() Select Case $msg = $combo $Folder = GUICtrlRead($combo) $sINFFolder = $sDir & "\" & $Folder $aTemp = _FileListToArray( $sINFFolder, "*.inf",1) If UBound($aTemp)=2 Then ; Get the driver ConsoleWrite("your driver=[" & $sINFFolder & "\" & $aTemp[1] & "]" & @CRLF) $aDrivers = CreateDriverControls($aDrivers, $sINFFolder & "\" & $aTemp[1]) Else ConsoleWrite("no driver, or multiple drivers, in=[" & $sINFFolder & "\" & "]" & @CRLF) EndIf Case $msg = $button ConsoleWrite("Do something with driver=[" & $driver & "]." & @CRLF) Case _ArraySearch($aDrivers,$msg,0,0,0,0,1,0)>0 $driver=$aDrivers[_ArraySearch($aDrivers,$msg,0,0,0,0,1,0)][1] ConsoleWrite("changed radio selection to=[" & $driver & "]." & @CRLF) If Not BitAND(GUICtrlGetState($button),$GUI_ENABLE) Then GUICtrlSetState($button,$GUI_ENABLE) EndSelect If $msg = $GUI_EVENT_CLOSE Then ExitLoop WEnd Func CreateDriverControls ($aDrivers, $sINIFile) If BitAND(GUICtrlGetState($button),$GUI_ENABLE) Then GUICtrlSetState($button,$GUI_DISABLE) For $i = 0 To UBound($aDrivers) - 1 For $j = 0 To UBound($aDrivers,2) - 1 GUICtrlDelete($aDrivers[$i][$j]) Next Next $aTemp = IniReadSection($sINIFile, "device") $aTemp2 = IniReadSection($sINIFile, "drivers") $iStart = 40 $iControlHeight = 20 $iControlSpacing = 10 For $i = 1 To UBound($aTemp)-1 $aTemp[$i][0] = GUICtrlCreateRadio($aTemp[$i][1], $iControlSpacing,$iStart+($iControlSpacing*$i)+($iControlHeight*$i), 100 ) $aTemp2[$i][1] = GUICtrlCreateEdit($aTemp2[$i][1], 100+$iControlSpacing,$iStart+($iControlSpacing*$i)+($iControlHeight*$i), 250 ) Next Return $aTemp EndFunc that's way above my head . i am making progress though. i'm using an ini formatted as [devices] ASUS=\\asus.inf HP=\\hp.inf 0 is the name and 1 is the path, after a selection is made i want "1" to be set into a variable. that is the last problem i'm having. i think i've been looking at the code too long. here's the code that population of combo box. $cbox = IniReadSection("device.ini","devices") If @error Then MsgBox(4096, "", "Error occurred, probably no INI file.") Else For $i = 1 To $cbox[0][0] GUICtrlSetData($cb_platform,$cbox[$i][0]) Next End and here's the function. Func selection() $sSel = GUICtrlRead($cb_platform) $iIndex = _ArraySearch($cbox, $ssel) $driver = (@scriptdir & $iIndex) MsgBox(1, "",$driver) ; $nothing = $option EndFunc using this function all i get it does is display the "case" of the select item so for install it shows c:asuscase when the first option is selected and c:hpcase1 when the second is selected. i know i'm close i'm just looking at it to hard i think.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now