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.
Beiträge von hipfzwirgel
-
-
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
#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…/win32/winmsg/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. -
Hallo Moombas,
jetzt sind wir auf jedenfall ein Stück weiter: Es wird ein 2 dimensionales Array erstellt. In Col 1 steht der erste Wert und in Col. 2 der 2. wert.
Soweit so gut. Nur eins noch:Der _ArrayDelete löscht das ganze $a_String-Array.
Hast du eine Idee zur Lösung?Code
Alles anzeigenFunc LEN_BiosSettings() ; Teilweise erstellt von AutoIt Scriptomatic Local $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[1] Local $aArray Local $a_String[1][2] = [[0, '']] $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\WMI") $colItems = $objWMIService.ExecQuery("SELECT * FROM Lenovo_BiosSetting", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems ReDim $aBiosArray[UBound($aBiosArray) + 1] $aBiosArray[UBound($aBiosArray) - 1] = $objItem.CurrentSetting _ArrayAdd($a_String, $aBiosArray[UBound($aBiosArray) - 1], Default, ',') If $objItem.CurrentSetting = "" Then ReDim $aBiosArray[UBound($aBiosArray) - 1] EndIf Next _ArrayDisplay($a_String, "StringArray") Else MsgBox(0, "WMI-Ausgabe", "Keine WMI-Objekte gefunden für Klasse: " & "Lenovo_BiosSetting") EndIf MsgBox($MB_SYSTEMMODAL, "aBiosArray", _ArrayToString($aBiosArray, @CRLF)) EndFunc ;==>LEN_BiosSettings
Die Zeilen
-
geht auch nicht:
Fehlermeldung von SciTE"E:\BiosDump.au3" (43) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$a_String[UBound($a_String) - 1][2] = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",")[2]
^ ERROR
ich glaube so geht das ohnehin nicht, da Stringsplit ja ein komplettes Array erzeugt und wir versuchen das in eine Zeile zu Schreiben....
das mit dem _Arrayadd scheint auch nicht zu gehen, da das _ArrayDisplay im Nachgang $a_String nicht anzeigt... -
Hallo Moombas,
vielen lieben Dank für die Idee. ich musste deinen Code etwas korrigieren, aber leider klappt das nicht wie wir dachten; korrigierter String
ReDim $a_String[UBound($a_String) + 1]
$a_String[UBound($a_String) - 1] = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",")
erzeugt aber die folgende Ausgabe:
Row|Col 0
[0]|
[1]|{Array}
[2]|{Array}
[3]|{Array}
[4]|{Array}
[5]|{Array}
[6]|{Array}
.
.
.
Jetzt scheint der Stringsplit nicht zu gehen.
-
Hallo Profis,
mit der folgenden Schleife frage ich die Bios-Settings eines Lenovorechners abCode
Alles anzeigenFunc LEN_BiosSettings() Local $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[1] 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 ReDim $aBiosArray[UBound($aBiosArray) + 1] $aBiosArray[UBound($aBiosArray) - 1] = $objItem.CurrentSetting $a_String = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",") If $objItem.CurrentSetting = "" Then ; hier werden leere Einträge gelöscht ReDim $aBiosArray[UBound($aBiosArray) - 1] EndIf Next Else MsgBox(0, "WMI-Ausgabe", "Keine WMI-Objekte gefunden für Klasse: " & "Lenovo_BiosSetting") EndIf MsgBox($MB_SYSTEMMODAL, "aBiosArray", _ArrayToString($aBiosArray, @CRLF)) EndFunc ;==>LEN_BiosSettings
Die Ausgabe für $aBiosArray[UBound($aBiosArray) - 1] =$objitem.CurrentSetting wäre z.B.
Row|Col 0
[1]|WakeOnLAN,ACOnly
.
.
.
[n] laber,bla
Um die Ausgabe "lesefreundlich" zu machen hätte ich gerne den Wert des jeweiligen Index in 2 Werte aufgeteilt, nämlich
"AttributeName: WakeOnLan " -- CurrentSetting: " ACOnly.
Die Zeile $a_String = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",") erzeugt zwar ein Array mit den beiden Strings als jeweiligem Index
aber es scheint so als ob $a_String immer wieder überschrieben wird.
Hat jemand eine Idee wie ich die beiden Beispiel-Strings WakeOnLan und ACOnly als zwei Werte gespeichert bekomme? -
Hallo Peter,
es geht um Win 10 21H2. ich frage nur, weil das bisher immer funktioniert hat und auf einmal eben nicht mehr.
Für mich macht eine Elevation nur zum Fensterverschieben i-wie keinen Sinn. UAC abschalten geht nicht, da es sich um einen Firmen-Rechner handelt.
Es interessiert mich eigentlich ob jemand weiss, was sich da geändert haben könnte und das plötzlich die UAC sich da einmischt. -
Hallo Musashi,
vielen lieben Dank für deine Erklärung. Jetzt würde es mich aber dennoch interessieren, wieso WinMove überhaupt erhöhte Rechte benötigt.
schließlich kann ich ja die Fenster, egal ob das zugrundeliegende Programm mit oder ohne Adminrechte gestartet wurde mit der Maus
beliebig verschieben, ohne dass Elevation eine Rolle spielt, bzw. die UAC einschreitet?
Hat jemand dazu eine Erklärung? -
Hallole Zusammen,
jetzt bin ich geplättet: seit neuestem muss mein Script mit Adminrechten ausgeführt werden, damit es Winmove() ausführt.
Starte ich das Script im SciTE mit F5 ohne Admin werden die Fenster nicht verschoben. Das gleiche gilt, wenn ich das Script kompiliere
und als *.exe starte. Es wird die *.exe zwar ausgeführt aber die Winmove-Funktionen nicht, d.h. die Fenster werden nicht verschoben.
Hat jemand eine Idee wieso WinMove() erhöhte Rechte benötigt?; Das Programm soll nur bestimmte Fenster an eine definierte Position verschieben.
Es kann mit Parameter(die Handles der zu verschiebenden Fenster) aus einer anderen Anwendung heraus gestartet werden oder als Standalone-Version.#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_x64=WindowReposit.exe
#AutoIt3Wrapper_Res_Fileversion=1.0.0.16
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=2018 by HaSc
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <AutoItConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <Misc.au3>
If $CmdLine[0] > 0 then
Global $hWnd = $CmdLine[0] ; ist die Anzahl der Parameter der übergebenen Handles der Keepass-Fenster
Global $hWnd1 = HWnd($CmdLine[1]) ; ist Parameter 1
Global $hWnd2 = HWnd($CmdLine[2]) ; ist Parameter 2
Global $hWnd3 = HWnd($CmdLine[3]) ; ...
;Local $aPos = WinGetPos("AdminTool by HS 2017")
;_ArrayDisplay($apos, "1D display")
WinMove("AdminTool by HS 2017", "", 2963, 1, 450, 480)
Sleep(200)
WinMove("Standard", "", 1914, 0, 1042, 1073)
Sleep(300)
WinSetState("Standard", "", @SW_MINIMIZE)
Sleep(100)
WinMove($hWnd1, "Bla.kdbx - KeePass", 2728, 493, 450, 580)
Sleep(200)
WinMove($hWnd2, "Bla.kdbx - KeePass", 2963, 493, 450, 580)
Sleep(200)
WinMove($hWnd3, "Bla.kdbx - KeePass", 3270, 493, 450, 580)
Sleep(200)
WinMove("Skype for Business", "", 3432, 1, 402, 1065)
sleep(200)
exit
Else
Local $aWinList = WinList("[REGEXPTITLE:(?i)(Bosch.*Keepass*)]") ; Winlist erstellt eine Liste aller geöffneten Fenster und dann wird Array nach Indizes mit Namen Keepass gefiltert
Global $hWnd1 = $aWinList[1][1] ; ist Parameter 1
Global $hWnd2 = $aWinList[2][1] ; ist Parameter 2
Global $hWnd3 = $aWinList[3][1] ;
WinMove("AdminTool by HS 2017", "", 2963, 1, 450, 480)
Sleep(200)
WinMove("Standard", "", 1914, 0, 1042, 1073)
Sleep(300)
WinSetState("Standard", "", @SW_MINIMIZE)
Sleep(300)
WinMove($hWnd1, "Bla.kdbx - KeePass", 2728, 493, 450, 580)
Sleep(300)
WinMove($hWnd2, "bla.kdbx - KeePass", 2963, 493, 450, 580)
Sleep(300)
WinMove($hWnd3, "bla.kdbx - KeePass", 3270, 493, 450, 580)
Sleep(300)
WinMove("Skype for Business", "", 3432, 1, 402, 1065)
sleep(200)
exit
EndIf
-
Hallo zusammen,
vielen lieben Dank für eure Denkansätze.
Die Vorschläge die UDF umzuschreiben oder dergleichen würden ja genau das beinhalten was ich umgehen wollte: Zu viel Aufwand
Ich betrachte die Fragestellung als gelöst und erstelle ggf. einen eigenen Splashscreen. -
Hallole,
ja es ist die von Melba23. Musashi hat recht.
MojoeB: da zunächst der Aufruf von Splash in Verbindung mit der ExtMsgbox nicht ging, hatte ich gedacht frage ich mal nach.
Das was die beiden aufgerufenen Funktionen machen spielt dabei, wenn überhaupt, nur eine untergeordnete Rolle. Deshalb hatte ich den Code nicht näher ausgeführt.
Ich habe schon richtige Splashscreens geschrieben aber ich dachte vielleicht kann man ja die ExtMsgBox i-wie dazu verwenden. Das wäre viel weniger aufwändig...