Hallo Racer,
vielen lieben Dank für deine Antwort. Leider kann ich hierfür kein Powershell benutzen, weil die Runtimes dazu in unserer POE-Umgebung fehlen.
Des weiteren benutzt PS dazu Commandlets, deren Code ich bis jetzt nicht finden konnte. Das Commandlet Getbios-... z.B. ist ja unter Autoit nicht nutzbar.
da müsste ich erst mal den hinterlegten Code auch noch erst übersetzen. Da wäre das Umsetzen von VBS viel einfacher.
Leider scheine ich aber i-was zu übersehen. Denn wie gesagt das VBS-Script funzt. Nur meine "Übersetzung" geht immer auf Fehler 4 (Failed)
Kann jemand Helfen
Beiträge von hipfzwirgel
-
-
Nachtrag:
Ich bin mit meiner Recherche etwas weiter gekommen:
so sieht der funktionierende VBS-Code aus:Code
Alles anzeigenConst wbemFlagReturnImmediately = 16 Const wbemFlagForwardOnly = 32 lFlags = wbemFlagReturnImmediately + wbemFlagForwardOnly strService = "winmgmts:{impersonationlevel=impersonate}//" strComputer = "." strNamespace = "/root/HP/InstrumentedBIOS" strQuery = "select * from HP_BIOSSettingInterface" Set objWMIService = GetObject(strService & _ strComputer & strNamespace) Set colItems = objWMIService.ExecQuery(strQuery,,lFlags) Dim strReturn For each objItem in colItems objItem.SetBiosSetting oReturn, _ "TPM Activation Policy", _ "No prompts", _ "<utf-16/>itrepair" Next
Kann mir jemand sagen wie ich das in AutoIt korrekt "übersetze"?
Mein Code führt immer zum Fehler 4 was "Failed" bedeutet.Code
Alles anzeigenLocal $strRequest = '"TPM Activation Policy"' & "," & '"No prompts"' & "," & "<utf-16/>" & $sPwd2 . . . $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\HP\InstrumentedBios") $colItems = $objWMIService.ExecQuery("SELECT * FROM HP_BiosSettingInterface", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $objItem.SetBiosSetting($strReturn, $strRequest) Next EndIf
-
Hallo Gemeinde,
weiss jemand wie man auf HP-Rechnern eine BIOS-Einstellung via WMI ändern kann bei gesetztem Admin-PWD?
der folgende Code(die Option TPM Activation Policy soll auf "No Prompts" geändert werden) geht jedenfalls nicht:Code
Alles anzeigenLocal $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[1] Local $strRequest = "TPM Activation Policy" & "," & "No prompts" & "," & $sPwd2 Local $strReturn $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\HP\InstrumentedBios") $colItems = $objWMIService.ExecQuery("SELECT * FROM HP_BiosSettingInterface", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $objItem.SetBiosSetting($strRequest, $strReturn) Next ToolTip($strRequest & @CRLF & @CRLF & $strReturn, Default, Default, "ausgabe Object", 0, 6) Sleep(15000) EndIf
Bei Google finde ich leider nur Powershell-Beispiele. Klar könnte ich das HP-Eigene Tool nutzen aber ich will lernen die Einstellungen direkt per wmi zu machen...
UND: Für den mir vorgegebenen Einsatzzweck ist Powershell keine Lösung weil es die Runtimes dazu in unserem WINPE(und zwar unabänderlich!!!!) nicht gibt. -
-
Hallo Gemeinde,
ich möchte an mein Proggi 4 Variablen aus VBA heraus übergeben, als da wären cfgtext, Rechnername, uuid, sn.
In der cfgtext befindet sich mehrzeiliger formatierter Text, in den anderen jeweils nur ein Wort/Wert.Das Problem: der Inhalt der cfgtext wird in einzelne Indizes gespeichert, sodass nicht 4 Indizes sondern 27 existieren.
Kann man also eine mit formatiertem Text gefüllte Variable nicht an Autoit übergeben und wenn doch was mache ich falsch?So erstelle ich die Variable in VBA:
Cfgtext = Rechnername & Rechnp & Label & vbCrLf & "CPU: " & Me!cfgcpu & "RAM: " & Me!cfgram & vbCrLf & "Drive: " & Me!cfgdrive & vbCrLf & "GPU: " & Me!cfggrafik & "; WWAN: " & Me!cfgwwan & "; WIFI: " & Me!cfgwifi & "; Touch: " & cfgtouch & "; S/N: " & SN
das ist der Inhalt(aus Datenschutzgründen etwas gekürzt) der cfgtext(Debug-Anzeige in VBA):HP-Z2Leihstellung
CPU: Intel Core i7-12700KRAM: 2 x 16GB
Drive: MTFDKBA1T0TFH-1BC1AABHA 1TB
GPU: NVIDIA T400 2GB; Intel UHD Graphics 770; WWAN: 0; WIFI: 0; Touch: 0; S/N: CZC
das ist das resultierende cmdline-Array:Row|Col 0
[0]|27
[1]|HP-Z2LeihstellungCPU:
[2]|Intel
[3]|Core
[4]|i7-12700KRAM:
[5]|2
[6]|x
[7]|16GBDrive:
[8]|MTFDKBA1T0TFH-1BC1AABHA
[9]|1TBGPU:
[10]|NVIDIA
[11]|T400
[12]|2GB;
[13]|Intel
[14]|UHD
[15]|Graphics
[16]|770;
[17]|WWAN:
[18]|0;
[19]|WIFI:
[20]|0;
[21]|Touch:
[22]|0;
[23]|S/N:
[24]|CZC2
[25]|HP-Z2
[26]|E16D50
[27]|CZC
-
Hallo Bugfix,
vielen lieben Dank dafür -
Hallo Gemeinde,
es ist auf Dauer etwas müßig immer die gleichen Codeschnipsel eingeben zu müssen. Gibt es in SciTE vielleicht so etwas wie Autovervollständigung oder für
z.B. If Else EndIf oder Schleifen(For, DoWhile,...) oder Switches, etc. die Möglichkeit das Grundgerüst via Tastencode oder ähnlich einzutragen?
Hatte mal so etwas bei einem HTMl-Editor. Wäre echt cool wenn es das für SciTE auch gäbe... -
Hallo Gemeinde,
ich möchte in meinem Access 2016-Endlosformular "Kategorieansicht" die Schriftfarbe EINER Zeile in Grau ändern, wenn im Combofeld "Regalfach" dieser Zeile die Option "Zurückgeliefert" ausgewählt wurde.
MitCodeFor Each ctl In Me.Controls If ctl.ControlType >= acTextBox And ctl.ControlType <= acComboBox Then Me(ctl.name).FormatConditions.Delete Me(ctl.name).ForeColor = 13285815 ' grau End If Next ctl
färbt die Schleife aber ALLE Zeilen ein .
Im Grunde brauche ich eigentlich nur die Bezeichnung für die aktuelle Zeile anstatt Me.Controls (das spricht nämlich eben alle Controls des Formulars an, somit alle Zeilen).
Die Schleife steht im Switch/Case "Zurückgeliefert" somit ist die Bedingung schon erfüllt. -
Hallo Moombas,
ich nutze FileFind... nicht, weil da nur 1 oder -1 zurückkommt. Bei FileListToArray habe ich auch den Namen der Datei im Array und diesen Namen, der immer ein anderer sein kann, benötige im weiteren Verlauf für einige andere Aktionen, des Programmes... -
Hallo Gemeinde,
ich haben eben mit Musashis "Array-Code" $aArr = _FileListToArray(@ScriptDir, 'UUID-*.txt', 1) getestet und die Txt-Datei gab es nicht.
Er geht auf False => Ergo: _FileListToArray gibt KEIN leeres Array zurück.
Wäre hilfreich wenn das in der Hilfe stehen würde... -
Hallo Musashi,
vielen allerliebsten Dank für die Ausführungen.
Da der Fall somit erklärt und auch gelöst ist, schließe ich den Thread. -
Hallole,
ohhhh Mann, klarer Fall von den Bäumen und dem Wald. ich bin ja so dusselig. Klar setzt _Arraydisplay ja auch @error.
Vielen lieben Dank für insbesondere diesen Hinweis. Aber natürlich möchte ich mich auch für all die anderen Ideen bedanken
Ich hatte _Arraydisplay nur zur Kontrolle eingesetzt gehabt um zu sehen welche Werte im Array so kommen können. Ohne geht es wieder wunderbar.
Ist es in Autoit generell so, dass Funktionen(z.B. Stringsplit) die ein Array als Rückgabe haben, kein leeres Array zurückgeben?
ich hatte damit nämlich schon mal gekämpft... -
Hallo Moombas,
vielen lieben Dank für deine Antwort.
Was ich aber immer noch nicht verstehe, ist die Tatsache das @error = 4 ja bedeutet, keine Datei gefunden. Somit müsste er doch in den Case 4 springen.
Bedeutet das, dass FileListToArray aus @ScriptDir und dem Filter eine Pfadangabe erstellt und er dann feststellt, dass dieser Pfad nicht existiert? Dann würde dein Beispiel ja auch nicht gehen, da in dem Ordner ausser der
UUID-Rechnername.txt( "Rechnername" ist immer der jeweilige Rechnername auf dem das Script ausgeführt wird) keine weitere Textdatei im Regelfall vorhanden ist. Das würde aber dem HilfeText zu Filelist... widersprechen, da Suchen nach einer bestimmten Datei somit nie funktioniert. Auch stimmt die Rückgabe so nicht, da der Pfad @Scriptdir ja richtig ist. Er findet ja nur nicht die gesuchte Datei => ergo Case 4...Mach ich da einen Denkfehler Wenn ja welchen
-
Hallo Gemeinde,
so ganz verstehe ich wohl die Funktion FileListToArray nicht :Code
Alles anzeigen$FileList = _FileListToArray(@ScriptDir, 'UUID-*.txt', 1) ; Dateiname einlesen _ArrayDisplay($FileList) Switch @error Case 0 Case 1 MsgBox(0, "Warnung 1", "Pfad nicht gefunden oder ungültig") Exit Case 2 MsgBox(0, "Warnung 2", "$sFilter ungültig") Exit Case 3 MsgBox(0, "Warnung 3", "$iFlag ungültig") Exit Case 4 $sFilerst = MsgBox(4100, "Warnung 4", "Keine UUID-*.txt Datei(en) gefunden!!!" & @CRLF & @CRLF & "Möchten sie eine erstellen?") If $sFilerst = 6 Then $sEingabe = InputBox("Eingabe Rechnername", "Bitte geben sie den Rechnername ein:", @ComputerName) If Not FileWrite("UUID-" & $sEingabe & ".txt", "") Then MsgBox($MB_SYSTEMMODAL, "", "Es ist während dem schreiben der temporären Datei ein Fehler aufgetreten.") EndIf EndIf $FileList = _FileListToArray(@ScriptDir, 'UUID*.txt', 1) Case Else MsgBox(0, "Warning E", "unknown Error") Exit EndSwitch
im Scriptdir sollte eine Datei stehen mit Namen UUID-Rechnername.txt. Wenn die Datei nicht existiert, wird bei mir @error auf 1 gesetzt anstatt auf 4.
kann sich das jemand erklären? Ist der Filter falsch? Und warum wird _Arraydisplay nicht ausgeführt? -
Hallole Gemeinde,
ist es möglich das Systemmenü einer Gui auszublenden ohne das Icon der Gui ebenfalls auszublenden?
Hintergrund: Ein Programm soll quasi im Kioskmodus laufen, d.h. immer an. Deshalb würde ich da das Systemmenü ausblenden.
Mit der UDF _WinStyle.au3 von Bernd670 würde das Ausblenden des Menüs auch recht einfach zu realisieren sein (danke dafür ).
Wegen der Corporate-Identity-Vorgaben soll/muss aber das Icon der Firma in der Titelleiste erhalten bleiben...TestGui:
Code
Alles anzeigen#include <_WinStyle.au3> Const $SC_CLOSE = 0xF060 Const $MF_BYCOMMAND = 0x0 ;~ Const $MF_GRAYED = 0x1 ;~ Const $WM_SYSCOMMAND = 0x0112 $gui = GuiCreate("Catch the X Click", 300, 100) GUISetIcon("C:\Windows\System32\user32.dll", -2) GUISetState() $wh = WinGetHandle("Catch the X Click") ; <- Hier den Titel des Windowsfenster eintragen $WinStyle = _WinGetStyle($wh) _WinSetStyle($wh, "", BitAND($WinStyle[0], BitNOT($WS_SYSMENU))) While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit EndSelect WEnd
-
Hallo Gemeinde,
ich bin auf ein sehr seltsames Verhalten aufmerksam geworden beim konvertieren einer Grafik und einer Textdatei in jeweils ein PDF.
Dazu benutze ich die Funktionen basierend auf der MPDF_UDF.au3 von Mihai Iancu(vielen dank dafür )
Wenn ich also in meinem Proggi zuerst die Grafikdatei und dann die Textdatei konvertiere alles gut. Konvertiere ich jedoch zuerst die Textdatei und dann die Grafikdatei wird es mirakulös :
besteht die Textdatei aus einer Seite(Din a 4) wird dann beim Kovertieren der Grafik diese 2 x in die erzeugte GrafikPDF eingefügtbesteht die Textdatei aus mehr Seiten wird in die "GrafikPDF" erst die Grafik eingefügt dann der Text oder je nach Anzahl Seiten Ausschnitte davon und dann nochmal die Grafik
Da in den beiden Funktionen aber keine gleich lautenden Variablen, Arrays, whatever benutzt werden, kann das meines Erachtens nur an der UDF liegen.Code
Alles anzeigen[tt] Func _SelectImages() Local $sImg = FileOpenDialog("Select images", "Dateipfad", "Images (*.jpg;*png)", 4) If @error Then MsgBox(4096, "", "No File(s) choosen") Else Local $aImgs = StringSplit($sImg, "|", 3) ;set the properties for the pdf _SetTitle($sNameImg & "Img2PDF.pdf") _SetSubject("Convert image(s) to pdf") _SetKeywords("pdf, AutoIt") ;_OpenAfter(True) ;open after generation _SetUnit($PDF_UNIT_CM) _SetPaperSize("a4") _SetZoomMode($PDF_ZOOM_CUSTOM, 90) _SetOrientation($PDF_ORIENTATION_PORTRAIT) _SetLayoutMode($PDF_LAYOUT_CONTINOUS) ;initialize the pdf _InitPDF(@AppDataDir & "\HaSc\" & $sNameImg & "Img2PDF.pdf") If UBound($aImgs) <> 1 Then ;=== load resources used in pdf === For $i = 1 To UBound($aImgs) - 1 _LoadResImage("img" & $i, $aImgs[0] & "\" & $aImgs[$i]) Next ;load each image on it's own page For $i = 1 To UBound($aImgs) - 1 _BeginPage() ;scale image to paper size! _InsertImage("img" & $i, 2, 9, 17, 15) _EndPage() Next Else _LoadResImage("taietel", $aImgs[0]) _BeginPage() ;scale image to paper size! _InsertImage("taietel", 2, 9, 17, 15) _EndPage() EndIf ;then, finally, write the buffer to disk _ClosePDFFile() Sleep(300) GUICtrlSetData($EditSysNot, "HW-Summary-file is converted to pdf..." & @CRLF & @CRLF, 1) EndIf EndFunc ;==>_SelectImages [/tt] [tt] Func _SelectBiosDump() Local $idDelete = FileDelete(@AppDataDir & "\HS\" & $sNameImg & "Txt2Pdf.pdf") Local $sF = FileOpenDialog("Choose a text file", "Dateipfad", "Text file (*.txt)", 1) If @error Then MsgBox(4096, "", "No File(s) chosen") Else ;set the properties for the pdf _SetTitle($sNameImg & "Txt2PDF") _SetSubject("Convert text file to pdf") _SetKeywords("pdf, AutoIt") ;_OpenAfter(True) ;open after generation _SetUnit($PDF_UNIT_CM) _SetPaperSize("A4") _SetZoomMode($PDF_ZOOM_CUSTOM, 90) _SetOrientation($PDF_ORIENTATION_PORTRAIT) _SetLayoutMode($PDF_LAYOUT_CONTINOUS) ;initialize the pdf _InitPDF(@AppDataDir & "\HaSc\" & $sNameImg & "Txt2Pdf.pdf") _LoadFontTT("F1", $PDF_FONT_Arial, $PDF_FONT_Normal) _Txt2PDF($sF, "F1") ;write the buffer to disk _ClosePDFFile() Sleep(300) $sF = "" GUICtrlSetData($EditSysNot, "BIOS-dump-file is converted to pdf..." & @CRLF & @CRLF, 1) EndIf EndFunc ;==>_SelectBiosDump ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Txt2PDF ; Description ...: Convert a text file to pdf ; Syntax ........: _Txt2PDF( $sText , $sFontAlias ) ; Parameters ....: $sText - file path. ; $sFontAlias - font alias. ; Return values .: None ; Author(s) .....: Mihai Iancu (taietel at yahoo dot com) ; Modified ......: ; Remarks .......: If the string is very long, it will be scaled to paper width ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Txt2PDF($sFile, $sFontAlias) Local $hFile = FileOpen($sFile) Local $sText = FileRead($hFile) FileClose($hFile) Local $iUnit = Ceiling(_GetUnit()) Local $iX = 2 Local $iY = Ceiling(_GetPageHeight() / _GetUnit()) - 1.5 Local $iPagina = Ceiling(_GetPageWidth() / $iUnit) - $iX Local $iWidth = Ceiling($iPagina - $iX) ;, 1) Local $lScale Local $iRanduri = StringSplit($sText & @CRLF & @CRLF & @CRLF & @CRLF, @CRLF, 3) Local $iHR = 0.5 * Ceiling($iY / (10 * $iUnit)) Local $iPages = Ceiling((UBound($iRanduri)) * $iHR / $iY) Local $iNrRanduri = Ceiling(UBound($iRanduri) / $iPages - 2) Local $nrp ;MsgBox(0, "Pages", $iPages) For $j = 0 To $iPages - 1 ;For $j = 0 To $iPages + 2 $nrp = _BeginPage() _DrawText(_GetPageWidth() / _GetUnit() - 1, 1, $nrp, "F1", 10, $PDF_ALIGN_CENTER) For $i = 0 To $iNrRanduri - 1 Local $sLength = Round(_GetTextLength($iRanduri[$i + $j * $iNrRanduri], $sFontAlias, 10)) Local $iH = $iY - $iHR * ($i + 1) Select Case $iH < 1 _EndPage() Case $i + $j * $iNrRanduri = UBound($iRanduri) - 1 _EndPage() Return Case $sLength > $iWidth - 1 $lScale = Ceiling($iWidth * 100 / $sLength) _SetTextHorizontalScaling($lScale) _DrawText($iX, $iH, $iRanduri[$i + $j * $iNrRanduri], $sFontAlias, 10, $PDF_ALIGN_LEFT, 0) _SetTextHorizontalScaling(100) Case Else _DrawText($iX, $iH, $iRanduri[$i + $j * $iNrRanduri], $sFontAlias, 10, $PDF_ALIGN_LEFT, 0) EndSelect Next _EndPage() Next EndFunc ;==>_Txt2PDF [/tt]
Die beiden Funktkionen werden in der GUI per Buttonklick ausgelöst.
Weiss jemand wie es zu dem Verhalten kommt und wie man das korrigieren kann?
Und kann mir jemand erklären woran es liegt, dass die Text-Konvertierung fast nie die ganze Seite füllt, sondern nach ca. 2 drittel der Seite eine neue Seite anfängt? Manchmal wird auch die erste Seite wiederholt....
ich habe ausser die Pfadangaben, die MsgBoxen und die GuiCtrlSetdata-Anagaben an dem bereitgestelltem Code nichts weiter verändert. Achja: die Variable $NameImg beinhaltet nur eine Zahl die an den Dateinamen gehängt wird, da es sein kann, das mehrere Txt/Grafik-Dateien zu konvertieren sind, die ich dann später jeweils einer anderen PDF zuordne um diese drei dann zu mergen. -
-
Hallo Bugfix,
mir ist zum zumute...
Offenbar funzt das doch nicht richtig . Jetzt reagiert die FUNC schon auf den ersten Zeilenumbruch:
Der Inhalt des QR-Codes sieht so aus:
DeviceName @CRLF
Label: Leihstellung @CRLF
UUID: 1234... @CRLF
S/N: 98765432 CRLF vom Scanner
Vielleicht würde es gehen wenn man die Sequenz ' .*(\r\n + \Z' um den String S/N: ergänzt, sodaß er quasi nur das CRLF der letzten Zeile auswertet...
'S/N: *(\r\n + \Z' geht jedenfalls nicht... -
Hallo Bugfix,
danke für den Anreiz.
Ich habe es getestet. Offenbar sendet mein Scanner tatsächlich CRLF denn dein Vorschlag funktioniert perfekt.
Frage mich nun aber was der unterschied zwischen @CRLF und der Entertaste ist
Sollte schlussendlich doch der gleiche Key-Code sein... -
Hallo an die Spezialisten,
ich habe eben die Funktion _WM_Command zur überwchung des EDIT Controls $idCode erstellt.Code
Alles anzeigen[tt]Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndFrom, $iIDFrom, $iCode $hWndFrom = $lParam $iIDFrom = _WinAPI_LoWord($wParam) $iCode = _WinAPI_HiWord($wParam) Switch $iIDFrom Case $idCode ; Edit HW-Sacn Switch $iCode Case $EN_UPDATE $sEditTxt = GUICtrlRead($idCode) Local $iPosition = StringInStr($sEditTxt, "S/N:") Sleep(2000) If $iPosition > 0 Then GUICtrlSetState($Button1, $GUI_ENABLE) EndIf EndSwitch EndSwitch EndFunc ;==>_WM_COMMAND[/tt]
Dazu habe ich eine Verständnisfrage: Wodurch wird Case $EN_UPdate ausgelöst
Hintergrund:
Wenn ich in das Edit den String S/N: manuell eingebe und die Entertaste drücke wird der Anweisungsblock im Case ausgeführt.
Scanne ich einen String mit einem 2D-Scanner aus einem QR-Code in dem ebenfalls S/N: vorkommt wird der Anweisungsblock nicht ausgeführt,
obwohl der Scanner IMMER am Ende eines Scans ein "Enter" mit sendet...