Hallo Bugfix,
es tut mir leid. Als ich deine Antwort erstmalig las, war der Code-Block nicht zu sehen. Vielleicht habe ich zu früh die Antwort gelesen.
Also ich teste das jetzt zunächst denn leider kann ich den Scanner nicht dazu bewegen ein alternatives Zeichen zu senden als Suffix...
Beiträge von hipfzwirgel
-
-
Hallo Moombas,
"an die Stirn klatsch" das ist auf jedenfall ein Versuch wert. Das ich da nicht selbst drauf gekommen bin War so auf das ENTER fixiert... -
Hallo Bugfix,
ich habe jetzt den vkCode versucht zu filtern aber er geht mir trotzdem in die Else und wertet somit ENTER nicht aus. ich verzweifle$sPattern auf die 13 gesetzt. Chr-Range auf 13 erhöht damit zugelassenes Zeichen. Trotzdem führt er die If -Abfrage in Zeile 12 nicht aus
sondern geht immer in die Else. Kannst du mir bitte sagen wie ich das ENTER richtig filtere?Code
Alles anzeigen$sPattern = 13 If Not $g_bScanActiv Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam) Local $tKEYHOOKS, $sChar $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam) If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam) If $wParam = $WM_KEYDOWN Then $sChar = Chr($tKEYHOOKS.vkCode) If StringRegExp($sChar, '[0-13]') Then ; $sChar kann jetzt nur "0 - 9" enthalten (nicht von NUMPAD-Eingabe) $g_sAusweisNr &= $sChar ; Speichern der einzelnen Zeichen in $g_sAusweisNr zur kompletten Ausweisnr die immer aus 6 Zahlen besteht If StringRegExp($sChar, $sPattern) Then Exit ($g_sAusweisNr) EndIf Else ; irgendein Nicht-Ziffer Zeichen - FEHLER $g_sAusweisNr = '' ; $g_sAusweisNr leeren Exit (815) EndIf
-
Hallo Bugfix,
vielen lieben Dank für deinen Denkanstoß. Der Leser erzeugt als "Return-Wert" Keyboard Enter. Sollte also passen.
Nur wie lasse ich das Keyboard-Enter in Zeile 9 zu? $sChr, '[0-9]' & @CRLF geht auch nicht... habe als $sPattern auch "\r\n" erfolglos versucht
Der User kann den Vorgang ja im Hauptprogramm abbrechen, sodass ich in der Keyproc darauf verzichten würde, damit da nichts den Hook stört oder blockiert... -
Hallo Gemeinde,
mit der Func Keyproc lese ich vom Kartenleser eine Ausweisnummer ein. Jetzt hat sich herausgestellt, dass es nicht nur 6-stellige Ausweisnummern gibt, sondern auch 5-stellige.
Um sicherzustellen, das auch anders-stellige außer 6-stellige nummern ausgelesen werden können habe ich den Leser so konfiguriert, das er nach dem Einlesen der Ziffern einen Zeilenvorschub
übergibt. Jetzt möchte ich den Zeilenvorschub mit StringRegExp abfangen. Aber das funktioniert nicht, da die Func so geschrieben ist, das er keine Zeichen außer die Zahlen 0-9 annimmt.
Ich habe den CHR-Range auf 13 erweitert, sodass CR und LF ebenfalls "erlaubt sind" aber das funktioniert nicht. Könnte mir jemand sagen was ich übersehen habe? Könnte es sein das ich die Variable
$sPattern nicht richtig deklariert habe?Code
Alles anzeigenFunc _KeyProc($nCode, $wParam, $lParam) $sPattern = @CRLF If Not $g_bScanActiv Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam) Local $tKEYHOOKS, $sChar $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam) If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam) If $wParam = $WM_KEYDOWN Then $sChar = Chr($tKEYHOOKS.vkCode) If StringRegExp($sChar, '[0-13]') Then ; $sChar kann jetzt nur "0 - 13" enthalten (nicht von NUMPAD-Eingabe), CHr10 - 13 = CR und lf $g_sAusweisNr &= $sChar ; Speichern der einzelnen Zeichen in $g_sAusweisNr zur kompletten Ausweisnr If StringRegExp($sChar, $sPattern) Then Exit ($g_sAusweisNr) EndIf Else ; irgendein Nicht-Ziffer Zeichen - FEHLER $g_sAusweisNr = '' ; $g_sAusweisNr leeren Exit (815) EndIf Return -1 ; Eingabe wird nicht an das System weitergeleitet EndIf Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam) EndFunc ;==>_KeyProc
-
Hallo Andy,
also vielen lieben Dank für den Tipp mit dem Adlibregister. Funktioniert super.
Aber dennoch habe ich noch eine Frage:AutoItFunc Ftsstat() FileWriteLine($sFilepath, $Date & ", " & $sTime & " 1353 Func Ftsstat started" & @CRLF & @CRLF) If $CmdLine[0] > "0" And $CmdLine[1] <> "" Then _WinAPI_WriteConsole($hConsole, " Please be patient until preparations are done...!" & @CRLF & @CRLF) Sleep(3000) Else ;GUICtrlSetData($Edit1, "Please be patient until preparations are done... " & @CRLF & @CRLF, 1) ; Das war der ursprüngliche Eintrag ohne Drehbalken. AdlibRegister("_Balken", 300) ; Die Zeile überschreibt das Edit aber komplett !!! EndIf
ich habe die Adlib-Anweisung wie oben dargestellt implementiert (die Funktion _Balken natürlich auch).
Jetzt kommt zwar die Zeile mit dem drehenden Balken, aber das überschreibt mir das Edit komplett. Das Edit sollte aber so aussehen wie im Anhang(das ist
noch die Darstellung mit dem Ursprungseintrag) d.h. die anderen Informationen (aus anderen Funktionen des Programms) müssen erhalten bleiben. Geht das irgendwie?
-
Hallo Solve-Smart,
Da hast du natürlich recht. bitte entschuldigt dass ich da im Hurra nicht dran dachte.
@ Aspirinjunkie:nur das kein Missverständnis im Raum steht: Ich hatte bevor ich den Code hier postete es auch mit z.B. Chrw(02502) probiert
aber wie gesagt kam nur Murks. Egal ist ja gelöst.
Habt ihr mir einen Tipp bzgl. der Implementation in die andere Func, wie in meinem letzten Eintrag skizziert? -
Hallo Aspirinjunkie,
vielen lieben Dank für den Tipp.
Ich hatte keine Ahnung, dass das nur mit den Hex-Zahlen geht. Ich probierte es mit den DEZ zahlen und da kam nur Murks.
So sieht das Super aus...
Vielleicht hast du mir noch einen Tipp:
In meiner Funktion Ftsstat(), würde ich gerne den Satz
"GUICtrlSetData($Edit1, "Please be patient until preparations are done...!" & @CRLF & @CRLF, 1)"
gegen Eintrag mit dem drehenden Balken austauschen.
Wie gehe ich da am besten vor? Die Funktion _Balken an der Stelle aufrufen wird wohl das Proramm so lange anhalten bis die wieder beendet ist oder ?Spoiler anzeigen
AutoIt
Alles anzeigenFunc Ftsstat() FileWriteLine($sFilepath, $Date & ", " & $sTime & " 1353 Func Ftsstat started" & @CRLF & @CRLF) ; Logfileeinträge und evtl. Ausgabe auf Console... If $CmdLine[0] > "0" And $CmdLine[1] <> "" Then _WinAPI_WriteConsole($hConsole, " Please be patient until preparations are done...!" & @CRLF & @CRLF) Sleep(3000) Else ; Ausgabe in Edit1, wenn Programm als GUI ausgeführt wurde... GUICtrlSetData($Edit1, "Please be patient until preparations are done...!" & @CRLF & @CRLF, 1) ;<== Hier sollte statt dem FixenEintrag, der "DrehendeBalkenEintrag" erscheinen EndIf ; Jetzt wird das Fujitsu-Programm im Hintergrund ausgeführt und das braucht ca. 30 sekunden, weil evtl. mehrere Versuche notwendig sind. Local $Status = Run(@ComSpec & " /c " & $sProggiFTS & "/useinstalled /pwc= " & "/newpwc=" & $sPubFTSPW, @TempDir, @SW_HIDE, $STDOUT_CHILD) ; try to set public bios-lock FileWriteLine($sFilepath, $Date & ", " & $sTime & " 1362 RunPID: " & $Status & "_" & @error & @CRLF & @CRLF) ProcessWaitClose($Status) ; Hier wird dann der Output vom FTS-Proggi ausgewertet . . Switch $sVar Case "Success" FileWriteLine($sFilepath, $Date & ", " & $sTime & " 1387 " & "BlaBlupp is active! ExitCode: 0" & @CRLF & @CRLF) If $CmdLine[0] > "0" And $CmdLine[1] <> "" Then _WinAPI_WriteConsole($hConsole, @CRLF & " BlaBlupp is active!" & @CRLF & @CRLF) _WinAPI_WriteConsole($hConsole, @CRLF & "0" & @CRLF & @CRLF) Sleep(3000) Else ; Hier müsste die Schleife von _Balken() beendet werden, damit der nächste Eintrag ins Edit geschrieben werden kann... GUICtrlSetData($Edit1, "BlaBlupp is active!" & @CRLF & @CRLF, 1) GUICtrlSetState($Button2, $GUI_ENABLE) GUICtrlSetState($Button4, $GUI_ENABLE) ; Aus Datenschutzgründen kann ich an dieser Stelle nicht die komplette Func anzeigen... ;... ;... ;... EndIf EndFunc ;==>Ftsstat
-
Hello Peoples,
ich habe ein kleines Proggi geschrieben um in einem Edit ein Satz mit einem drehenden Balken dahinter anzuzeigen. Das würde ich als kleine Animation in einem anderen Proggi benutzen um dort eine
Wartezeit zu überbrücken, solange bestimmte Dinge im Hintergrund ausgeführt werden.
Es ist mir beinahe peinlich aber ich bekomme es nicht hin, statt dem normalen Bindestrich (sieht echt doof aus), den langen Bindestrich (ASCII-Code 151) in dem Edit anzeigen zu lassen. Geht der Code gar nicht
oder brauche ich eine andere Schrift? Achja, in einer MsgBox wird Chr(151) richtig angezeigt...Spoiler anzeigen
AutoIt
Alles anzeigen#include <AutoItConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #Region ### START Koda GUI section ### Form= $Form1_1 = GUICreate("Form1", 616, 144, 610, 151) $Edit1 = GUICtrlCreateEdit("", 40, 32, 553, 50, $ES_READONLY) GUICtrlSetData(-1, "") GUICtrlSetFont(-1, 12, 800, 0, "Arial") GUISetState() DllCall("user32.dll", "int", "HideCaret", "int", 0) $Label1 = GUICtrlCreateLabel("Im Eingabe Feld sollte ein Balken kreiseln...", 40, 8, 208, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Global $i = 0 Global $bExitLoop = False ; Abbruchbedingung damit die While Wend schleife in _Balken beendet werden kann _Balken() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func _Balken() ;~ ### Auflistung der Zeichencodes für $n ### ;~ "|" ;124 Unicode = 02502 ;~ "/" ;47 Unicode = 02571 ;~ "-" ;45, long 151 Unicode = 02500 ;~ "\" ;92 Unicode = 02572 ;~ ### END Liste ### Local $a = 1 While Not $bExitLoop If $a = 26 Then $bExitLoop = True EndIf Switch $i Case $i = 1 $n = 124 Case $i = 2 $n = 47 Case $i = 3 $n = 45 Case $i = 4 $n = 92 Case $i > 4 $i = 0 Case Else ExitLoop EndSwitch If $bExitLoop Then GUICtrlSetData($Edit1, @CRLF & "ready") ExitLoop EndIf $i = $i + 1 $a += 1 GUICtrlSetData($Edit1, "please be patient until preparations are done... " & Chr($n)) Sleep(300) WEnd EndFunc ;==>_Balken
-
Hallo Sven,
erstmal vielen lieben Dank für den Vorschlag.
Im Grunde geht es genau darum. Ich habe drei KVM_Switche bei denen ich die "Dongle"-Bezeichung ändern soll. Also das "Suffix" _Port2 oder ähnlich soll weg
bzw. geändert werden. Jeder der KVMs hat 32 Ports ist also alles überschaubar.
Ich stelle also fest mein Ansatz geht in Richtung Grütze und auf die Art und Weise wie du sie vorschlägst wäre ich im Leben nicht gekommen. Eigentlich schade das es fast keine Arrayfunktionen gibt mit denen man Indizes direkt bearbeiten kann wie z.B. statt Stringsplit _ArrayIndexsplit oder so ähnlich. -
Olla alle zusammen,
zunächst ein gutes erfolgreiches und vor allem ein gesundes neues Jahr für euch alle.
Ich glaub ich krieg Hirnfrost: ich möchte die Zeilen eines Textes einlesen und alles ab dem Unterstrich weg haben.
die Textzeilen sehen so aus:Rechnername1_Port1
Rechnername2_Port2
..
.
Rechnername32_Port32
Jetzt habe ich schon so viel mit Stringsplit und Arrays etc. gearbeitet aber vermutlich hat mir die spanische Wintersonne das Hirn frittiert. Ich krieg das nicht hin
Spoiler anzeigen
#include <Array.au3>
#include <AutoItConstants.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <String.au3>
#include <StringConstants.au3>
$sFilePath = "E:\Portnamechanger\PortStrings.txt"
Example()
Func Example()
Local $aFileRead[1]
Local $hFileOpen = FileOpen($sFilePath, $FO_READ)
Local $a_String[1]
If $hFileOpen = -1 Then
MsgBox($MB_SYSTEMMODAL, "", "Es ist während dem lesen der Datei ein Fehler aufgetreten.")
Return False
EndIf
Local $s_String = ""
Local $a_String[1]
Local $aArray
For $i = 1 To 32 Step 1
ReDim $aFileRead[UBound($aFileRead) + 1]
$aFileRead[UBound($aFileRead) - 1] = Stringsplit(FileReadLine($hFileOpen, $i), "_")
_ArrayAdd($a_String, $aFileRead[UBound($aFileRead) - 1])
Next
_ArrayDisplay($a_String)
EndFunc ;==>Example
Mit dem Code im Spoiler sieht das Ergebnis so aus:
Row|Col 0
[0]|
[1]|1
[2]|
[3]|2
[4]|Rechnername1
[5]|Port1
[6]|2
[7]|Rechnername2
[8]|Port2
[9]|2
[10]|Rechnername3
[11]|Port3
Hat jemand eine Idee a) woher die Einträge mit den Zahlen herrühren und b) wie ich die Einträge Port x weg bekomme? mit Redim vielleicht...
Oder ist der komplette Ansatz Grütze? -
Hallo, ich hätte noch einen anderen Ansatz:
ich hatte bei meinem HW-Buchungstool fast das gleiche Problem: ich konnte nur einmal Scannen dann hing sich die Hookprozedur auf. Selbst mit Hilfe der Spezialisten hier im Forum
konnte nicht festgestellt werden warum das so war. Ich vermute, dass es mit der wie von Velted beschriebenen Änderung im OS zusammenhängt, wonach die Hookprozedur nur eine
knappe Sekunde lebt und dann vom OS gekillt wird. Ich hatte das so gelöst: ich habe die Hookprozedur in eine exe ausgelagert. Diese wird per Buttonklick aufgerufen, dann wird gescannt und dann der eingescannte Text
durch das aufrufende HW-Buchungstool ausgewertet. Damit ist sichergestellt, dass die Hookprozedur nur den Scan einliest und kein weiterer Code in der Hook-Proz aus geführt wird oder diese "stört".
Zudem muss ich mir keine Sorgen mehr machen ob der Hook noch läuft und andere Eingaben blockiert und ich ihn deaktivere und später wieder aktiviere... Ob diese Lösung für deinen Anwendungsfall "performant" genug ist kann ich natürlich nicht beurteilen. Bei mir jedenfalls funzt das so einwandfrei aber bei mir wird auch kein Massenscan gemacht...siehe auch den Hinweis unter https://learn.microsoft.com/de-de/windows/…msg/about-hooks
"...Hooks neigen dazu, das System zu verlangsamen, da sie die Menge der Verarbeitung des Systems für jede
Nachricht erhöhen müssen. Sie sollten einen Hook nur bei Bedarf installieren und so bald wie möglich entfernen..."und ein Mitschnitt aus meiner Unterhaltung wegen des Probs seinerzeit mit Bugfix:
".... könnte uns das in die Suppe spucken(gefunden bei LowLevelKeyboardProc callback function auf MS-Seite):...der Wert wird in Millisekunden angegeben. Wenn die Hook-Prozedur eine Zeitüberschreitung aufweist, übergibt das System die Nachricht an den nächsten Hook. Unter Windows 7 und höher wird der Hook jedoch stillschweigend entfernt, ohne aufgerufen zu werden. Es gibt keine Möglichkeit für die Anwendung zu wissen, ob der Hook entfernt wurde.
Windows 10 Version 1709 und höher Der maximale Timeout-Wert, den das System zulässt, beträgt 1000 Millisekunden (1 Sekunde).
Das System verwendet standardmäßig eine Zeitüberschreitung von 1000 Millisekunden, wenn der Wert LowLevelHooksTimeout auf einen Wert größer als 1000 gesetzt wird ..."
-
Hallo Peter S. Taler,
leider kann ich das nicht abschalten (Group-Policies, etc.) aber das ist auch nicht mehr nötig. Warum auch immer, geht es jetzt seit 2 Tagen wieder.
Keine Ahnung was das gewesen sein könnte. Ich schließe den Post da sich das Prob von alleine erledigt hat... -
Hallo Nochmal,
ich muss das Proggi etwas anpassen, da die Abfrage bei Dell Rechnern etwas umfangreicher ist, d.h. ich muss mehrere Klassen abfragen.
Eine davon ist die Klasse Bootorder. Damit habe ich ein Problem.Code
Alles anzeigen$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\Dcim\sysman\biosattributes") $colItems = $objWMIService.ExecQuery("SELECT * FROM BootOrder", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems ReDim $aBiosArray[UBound($aBiosArray) + 1] $strBootOrder = $strBootOrder & $objItem.BootOrder(0) $aBiosArray[UBound($aBiosArray) - 1] = "AttributeName: " & $objItem.BootListType & " -- BootOrder: " & $strBootOrder Next Else MsgBox(0, "WMI-Ausgabe", "No WMI objects found for class: " & "EnumerationAttribute") EndIf
Das objitem.BootOrder aus Zeile 13 gibt in dieser Form nur den Wert WindowsBootmanager zurück. Da sollten aber auf meinem TestDevice mind. 5 BootGeräte zurückgegeben werden.
Der VBS-Code von WMI-Explorer sieht so aus: strBootOrder = Join(objItem.BootOrder, ","). Die Join Funktion schreibt kommagetrennt die Werte von objitem.BootOrder in die Variable strBootOrder.
Kann mir jemand einen Tipp geben wie ich das in AutoIt umsetzen kann? Meine Zeile 13 war der klägliche Versuch das zu erreichen -
Hallo ihr Zwei,
also bei meinem UseCase fällt das nicht so ins Gewicht. Da reden wir, nach meinen Tests auf den bei uns existierenden Rechnern, von
unter hundert Bios-Optionen, sprich Einträgen.
Aber ich gebe Bugfix recht, sollte jemand das für deutlich größere Datenmengen, bzw. Arrays einsetzen ist das sicherlich das bessere Vorgehen.
Das Tool ist von meiner Seite aus fertig und somit auch dieser Post. Ich lasse ihn aber noch ein paar Tage offen falls wer noch Fragen hat oder weiter diskutieren möchteNochmals vielen herzlichen Dank an euch beide. Ihr wart mir wie immer eine große Hilfe und Bereicherung
C
Alles anzeigen#RequireAdmin #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Outfile_x64=BiosDump.Exe #AutoIt3Wrapper_Res_Fileversion=1.0.0.1 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y #AutoIt3Wrapper_Res_LegalCopyright=by HaSc #AutoIt3Wrapper_Res_Field=Made By|HaSc #AutoIt3Wrapper_Run_Tidy=y #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/MO #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ; #INDEX# ======================================================================================================================= ; Title .........: BiosDump.au3 ; AutoIt Version : 3.3.14.2 ; Language ......: English ; Description ...: Reading out the current Bios-Options from Dell, HP and Lenovo Computers and save it into Txt-file ; Author(s) .....: HaSc. Developed with the generous assistance of Moombas and Bugfix from the german Autoit-Forum. ; Many and sincere thanks for your assistance!!!!!!!!!!! ; =============================================================================================================================== #include <Array.au3> #include <AutoItConstants.au3> #include <WinAPI.au3> #include <WinAPIFiles.au3> #include <WinAPIShPath.au3> #include <WindowsConstants.au3> #include <File.au3> Global $sModelvendor = Vend() Global $sComputermodel = Compmod() Global $sFilePath = "./BiosDump.txt" Global $Comp = @ComputerName Global $s_Dumptxt = "" Switch $sModelvendor Case "LENOVO" If $sComputermodel = "THINKPAD" Then $hFileOpen = FileOpen($sFilePath, $FO_APPEND) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred while reading the file.") EndIf FileWrite($hFileOpen, $s_Dumptxt) _FileWriteFromArray($hFileOpen, LEN_LappiBiosSettings()) Else $hFileOpen = FileOpen($sFilePath, $FO_APPEND) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred while reading the file.") EndIf FileWrite($hFileOpen, $s_Dumptxt) _FileWriteFromArray($hFileOpen, LEN_DesktopBiosSettings()) EndIf Case "HP" $s_Dumptxt = HP_BiosSettings() $hFileOpen = FileOpen($sFilePath, $FO_APPEND) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred while reading the file.") EndIf FileWrite($hFileOpen, $s_Dumptxt) Case "DELL" $s_Dumptxt = Dell_BiosSettings() $hFileOpen = FileOpen($sFilePath, $FO_APPEND) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred while reading the file.") EndIf FileWrite($hFileOpen, $s_Dumptxt) Case "HEWLETT-PACKARD" $s_Dumptxt = HP_BiosSettings() $hFileOpen = FileOpen($sFilePath, $FO_APPEND) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred while reading the file.") EndIf FileWrite($hFileOpen, $s_Dumptxt) Case Else MsgBox($MB_SYSTEMMODAL, "351: Wrong Vendor", "Error: The Vendor from this device is not supported right now!" & @CRLF & @CRLF & "Program termination!") Sleep(2000) Exit EndSwitch ; #FUNCTION LEN_LappiBiosSettings()# =============================================================================================== ; Author ........: Bugfix, HaSc ; Description....: Reading out the Bios-Options on Lenovo Laptop Computers. I decided to create another function for the desktop ; computers, because Lenovo laptops and desktops have their bios from different manufacturers. ; If the necessary WMI classes change with one of the BIOS manufacturers, this can then be adapted more easily. ; ================================================================================================================================== Func LEN_LappiBiosSettings() ; Teilweise erstellt von AutoIt Scriptomatic Local $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[200][2] Local $nCount = 0, $sSetting, $aSplit Local $a_String $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\WMI") $colItems = $objWMIService.ExecQuery("SELECT * FROM Lenovo_BiosSetting", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $sSetting = $objItem.CurrentSetting If $sSetting <> "" Then $aSplit = StringSplit($sSetting, ",") $aBiosArray[$nCount][0] = $aSplit[1] $aBiosArray[$nCount][1] = $aSplit[2] $nCount += 1 EndIf Next ReDim $aBiosArray[$nCount + 1][2] Else MsgBox(0, "WMI-Ausgabe", "Keine WMI-Objekte gefunden für Klasse: " & "Lenovo_BiosSetting") EndIf Return $aBiosArray EndFunc ;==>LEN_LappiBiosSettings ; #FUNCTION LEN_DesktopBiosSettings()# ============================================================================================= ; Author ........: Bugfix, HaSc ; Description....: Reading out the Bios-Options on Lenovo Desktop Computers. I decided to create another function for the desktop ; computers, because Lenovo laptops and desktops have their bios from different manufacturers. ; If the necessary WMI classes change with one of the BIOS manufacturers, this can then be adapted more easily. ; ================================================================================================================================= Func LEN_DesktopBiosSettings() Local $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[200][2] Local $nCount = 0, $sSetting, $aSplit Local $a_String $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\WMI") $colItems = $objWMIService.ExecQuery("SELECT * FROM Lenovo_BiosSetting", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $sSetting = $objItem.CurrentSetting If $sSetting <> "" Then $aSplit = StringSplit($sSetting, ",") $aBiosArray[$nCount][0] = $aSplit[1] $aBiosArray[$nCount][1] = $aSplit[2] $nCount += 1 EndIf Next ReDim $aBiosArray[$nCount + 1][2] Else MsgBox(0, "WMI-Ausgabe", "Keine WMI-Objekte gefunden für Klasse: " & "Lenovo_BiosSetting") EndIf Return $aBiosArray EndFunc ;==>LEN_DesktopBiosSettings #FUNCTION HP_BiosSettings()# ==================================================================================================== ; Author ........: HaSc ; =============================================================================================================================== Func HP_BiosSettings() ; Teilweise erstellt von AutoIt Scriptomatic Local $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[1] Local $s_aString $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\HP\InstrumentedBIOS") $colItems = $objWMIService.ExecQuery("SELECT * FROM HP_BIOSEnumeration", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems ReDim $aBiosArray[UBound($aBiosArray) + 1] $aBiosArray[UBound($aBiosArray) - 1] = "AttributeName: " & $objItem.Name & " -- CurrentSetting: " & $objItem.CurrentValue If $objItem.CurrentValue = "" Then ReDim $aBiosArray[UBound($aBiosArray) - 1] EndIf Next Else MsgBox(0, "WMI-Ausgabe", "No WMI objects found for class: " & "HP_BIOSEnumeration") EndIf $s_aString = _ArrayToString($aBiosArray, @CRLF) Return $s_aString EndFunc ;==>HP_BiosSettings #FUNCTION DELL_BiosSettings()# ================================================================================================== ; Author ........: HaSc ; =============================================================================================================================== Func Dell_BiosSettings() ; Teilweise erstellt von AutoIt Scriptomatic Local $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[1] Local $s_aString $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\Dcim\sysman\biosattributes") $colItems = $objWMIService.ExecQuery("SELECT * FROM EnumerationAttribute", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems ReDim $aBiosArray[UBound($aBiosArray) + 1] $aBiosArray[UBound($aBiosArray) - 1] = "AttributeName: " & $objItem.AttributeName & " -- CurrentSetting: " & $objItem.CurrentValue If $objItem.CurrentValue = "" Then ReDim $aBiosArray[UBound($aBiosArray) - 1] EndIf Next Else MsgBox(0, "WMI-Ausgabe", "No WMI objects found for class: " & "EnumerationAttribute") EndIf $s_aString = _ArrayToString($aBiosArray, @CRLF) Return $s_aString EndFunc ;==>Dell_BiosSettings #FUNCTION Vend()# =============================================================================================================== ; Author ........: HaSc ; =============================================================================================================================== Func Vend() ;Auslesen Vendor aus WMI Local $Modelvendor = ObjGet("winmgmts:\\localhost\root\CIMV2").ExecQuery("SELECT Vendor FROM Win32_ComputerSystemProduct", "WQL", 0).ItemIndex(0).Vendor Local $aArray1 = StringSplit($Modelvendor, " ") $sString1 = StringUpper($aArray1[1]) ; String in Großbuchstaben umwandeln If $sString1 <> "LENOVO" And $sString1 <> "HP" And $sString1 <> "HEWLETT-PACKARD" And $sString1 <> "DELL" Then MsgBox($MB_SYSTEMMODAL, "351: Wrong Vendor", "Error: The Vendor from this device is not supported right now!" & @CRLF & @CRLF & "Program termination!") Sleep(300) Exit Else If Not FileWrite($sFilePath, " 0-series-test biosdump from " & $Comp & @CRLF & " ----------------------------------------" & @CRLF & @CRLF) Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred while writing the temporary file.") EndIf EndIf $aArray1 = Null Return $sString1 EndFunc ;==>Vend #FUNCTION Compmod()# ============================================================================================================ ; Author ........: HaSc ; =============================================================================================================================== Func Compmod() If $sModelvendor = "LENOVO" Then $Modelmod = ObjGet("winmgmts:\\localhost\root\CIMV2").ExecQuery("SELECT Version FROM Win32_ComputerSystemProduct", "WQL", 0).ItemIndex(0).Version Local $aArray = StringSplit($Modelmod, " ") ; Modell aus Text extrahieren Local $sVar = $aArray[1] ; ThinkPad, Thinkcenter oder Thinkstation $sString = StringUpper($sVar) ; String in Großbuchstaben umwandeln $aArray = Null ; $arBase[1] Return $sString EndIf $sVar = "" EndFunc ;==>Compmod
-
Hallo Moombas,
vielen lieben Dank für den Tipp. wird gleich getestet
Ich bin noch eine Antwort bzgl. der Variante von Bugfix schuldig:
Habe also eben auf Lenovo-Desktop getestet. Was soll ich sagen:
Funktioniert besser wie meine, da die Leerzeilen zwischendrin oder auch gleich die am Anfang weg gefiltert werden. Vielen leiben Dank dafür Bugfix -
Hallo Moombas,
da muss ich dir Recht geben. Der Hintergrund meiner Anfrage ist die Entwicklung eines Tools um die gesetzten BIOS-Optionen, für die bei uns
eingesetzten Computermodelle abzufragen. Da macht nur ein dynamisches Array Sinn. Die verschiedenen Hersteller haben ja unterschiedlich viele Bios-Optionen
Könnt ihr mir in dem Zusammenhang sagen. wie ich die beiden Indizes des mit _ArrayAdd($a_String, $aBiosArray[UBound($aBiosArray) - 1], Default, ',') erzeugten Arrays
in eine TextDatei hienein bekomme?
ich habe es so versucht $s_aString += "AttributeName: " & $a_String[UBound($aBiosArray) - 1][1] & " -- CurrentSetting: " & $a_String[UBound($aBiosArray) - 1][2]
aber in $s_aString wird nichts geschrieben -
Hallo Moombas,
so sieht das Array aus ohne den ExitLoop:Row|Col 0|Col 1
[0]|0|
[1]|WakeOnLAN|ACOnly
[2]|WakeOnLANDock|Enable
[3]|EthernetLANOptionROM|Enable
[4]|IPv4NetworkStack|Enable
[5]|IPv6NetworkStack|Enable
[6]|UefiPxeBootPriority|IPv4First
[7]|WirelessAutoDisconnection|Disable
[8]|MACAddressPassThrough|Disable
[9]|USBBIOSSupport|Enable
[10]|AlwaysOnUSB|Enable
[11]|TrackPoint|Automatic
[12]|TouchPad|Automatic
[13]|FnCtrlKeySwap|Disable
[14]|FnSticky|Enable
[15]|FnKeyAsPrimary|Enable
[16]|BootDisplayDevice|ExternalDisplay
[17]|SharedDisplayPriority|HDMI
[18]|TotalGraphicsMemory|512MB
[19]|BootTimeExtension|3
[20]|SpeedStep|Enable
[21]|AdaptiveThermalManagementAC|MaximizePerformance
[22]|AdaptiveThermalManagementBattery|Balanced
[23]|CPUPowerManagement|Automatic
[24]|OnByAcAttach|Enable
[25]|PasswordBeep|Disable
[26]|KeyboardBeep|Disable
[27]|HyperThreadingTechnology|Enable
[28]|AMTControl|Disable
[29]|USBKeyProvisioning|Disable
[30]|WakeByThunderbolt|Enable
[31]|ThunderboltSecurityLevel|NoSecurity
[32]|PreBootForThunderboltDevice|Disable
[33]|LockBIOSSetting|Disable
[34]|MinimumPasswordLength|Disable
[35]|BIOSPasswordAtUnattendedBoot|Enable
[36]|BIOSPasswordAtReboot|Disable
[37]|BIOSPasswordAtBootDeviceList|Disable
[38]|PasswordCountExceededError|Disable
[39]|FingerprintPredesktopAuthentication|Enable
[40]|FingerprintReaderPriority|External
[41]|FingerprintSecurityMode|Normal
[42]|FingerprintPasswordAuthentication|Enable
[43]|SecurityChip|Enable
[44]|TXTFeature|Disable
[45]|PhysicalPresenceForTpmClear|Enable
[46]|BIOSUpdateByEndUsers|Enable
[47]|SecureRollBackPrevention|Enable
[48]|WindowsUEFIFirmwareUpdate|Enable
[49]|DataExecutionPrevention|Enable
[50]|VirtualizationTechnology|Enable
[51]|VTdFeature|Enable
[52]|EthernetLANAccess|Enable
[53]|WirelessLANAccess|Enable
[54]|WirelessWANAccess|Enable
[55]|BluetoothAccess|Enable
[56]|USBPortAccess|Enable
[57]|MemoryCardSlotAccess|Enable
[58]|SmartCardSlotAccess|Enable
[59]|IntegratedCameraAccess|Enable
[60]|MicrophoneAccess|Enable
[61]|FingerprintReaderAccess|Enable
[62]|ThunderboltAccess|Enable
[63]|NfcAccess|Enable
[64]|BottomCoverTamperDetected|Disable
[65]|InternalStorageTamper|Disable
[66]|ComputraceModuleActivation|Enable
[67]|SecureBoot|Enable
[68]|SGXControl|SoftwareControl
[69]|DeviceGuard|Disable
[70]|BootMode|Diagnostics
[71]|StartupOptionKeys|Enable
[72]|BootDeviceListF12Option|Enable
[73]|BootOrder|USBCD:USBFDD:NVMe1:NVMe0:HDD0:USBHDD:PCILAN
[74]|NetworkBoot|PCILAN
[75]|BootOrderLock|Disable
[76]|I8254ClockGating|Auto
[77]|ThunderboltBIOSAssistMode|Disable
[78]|ThunderboltBIOSAssistMode|Disable
.
.
.
[254]|ThunderboltBIOSAssistMode|Disable
[255]|ThunderboltBIOSAssistMode|Disable
Mit ExitLoop oder der Variante von Bugfix fallen die Zeilen ab Nr. 77 weg...
Nachtrag: Die Lösung mit ExitLoop ist nur suboptimal. Bei LenovoDesktop Rechnern kommen am Anfang und auch zwischen drin Leereinträge vor
Ich teste morgen die Bugfix-Variante auf Lenovo-Desktoprechner und berichte...
-
Hallo Bugfix,
haben eben deinen Vorschlag getestet. Der Funzt genauso. -
Hallo Bugfix,
jetzt warst du schneller als ich. Werde deinen Versuch noch testen. Mein Versuch war auch erfolgreich:
Ich habe einfach in die If-Abfrage meiner Zeile 20 ein Exitloop eingebaut. Damit hört die Schleife auf wenn der erste leere Wert auftaucht.