Hallo Kanashius und Aspirinjunkie,
vielen lieben Dank für eure Erklärungen. Damit ist mir klar warum das nicht funktioniert. Aber es ist schon sehr seltsam, dass das eben seither funktionierte und dann auf einmal
und das nach Monaten oder Jahren nicht mehr.
Im Übrigen, der Code von Moombas mit dem Stringsplit funktioniert. Ich habe jedoch den Pfad zur XMl-Datei angepasst (sprich: die Datei nach C:\Daten kopiert) wegen des Freizeichens im Ordnername "Event Viewer". Das spart eine Menge Anführungszeichen und der Code für die Parameter muss nicht angepasst werden.
Das ist jetzt die Ausgabe von _DebugArraydisplay:
Row|Col 0
# 0|"eventvwr.exe"
# 1|"/v:C:\daten\Views\View_0.xml"
Auch für Euch ein gutes und vor allen dingen gesundes neues Jahr 2025 und nochmals vielen herzlichen Dank für die Erklärung
Beiträge von hipfzwirgel
-
-
Hallo alle Miteinander,
zunächst möchte ich allen ein gutes aber vor allem ein gesundes neues Jahr 2025 wünschen und mich für die Beiträge bedanken.
Leider ist aufgrund der Diskussion der Kern der Frage ins Abseits gerückt:
Worin besteht der Unterschied im Aufruf von Shellexecute, dass dieser funktioniert wenn ich
ShellExecute("eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""")
direkt aufrufe und der Aufruf von
Shellexecute($aArray[9]) -wobei der Inhalt des Indexes 9 exakt der Zeichenfolge des manuellen Aufrufes entspricht., nicht funktioniert und er die Datei nicht findet...
Die Debugausgabe von ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ShellExecute(' & $aArray[9] & ') - '& @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
gibt folgendes Ergebnis zurück:
@@ Debug(14) : ShellExecute("eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""")
Das zeigt, dass der Shellexecutebefehl exakt gleich ist, also sollte dieser doch auch funktionieren
Der Vorschlag von Moombas mit Stringsplit macht ja im Grunde nichts anderes als den String des Indexes in 2 Teile zu zerlegen und diese dann zum gleichen Shellexecutebefehl wie oben zusammenzusetzen... -
Hallo Gemeinde,
VERZWEIFLUNG PUR
ich habe bereits in 2019 ein AutostartProgramm erstellt, das bisher perfekt funktionierte. Seit Mitte letzter Woche aber lässt sich der Eventviewer nicht mehr starten...
Ich habe alles was ich nach dem Rechnerstart geöffnet haben möchte in einer Textdatei stehen.
Auszug:
E:\Downloads\KeePass-2.57\KeePass.exe
"C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE"
.
.
.
.
.
.
"eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml"""Rufe ich die Letzte Zeile mit ShellExecute("eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""") auf, funktioniert der Aufruf und die Benutzerdefinierte Ansicht wird geöffnet.
Rufe ich hingegen den Aufruf mittels vorher ausgelesener Text-Datei auf (FileReadToArray) bekomme ich den Fehler: "Datei nicht gefunden..."
Code
Alles anzeigen#include <AutoItConstants.au3> #include <WindowsConstants.au3> #include <Debug.au3> ShellExecute("eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""") "eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""" ; Inhalt aus $aArray[9] $sPfad = "E:\Arbeit\Autostart.txt" Local $aArray = FileReadToArray($sPfad) _DebugArrayDisplay($aArray) ShellExecute($aArray[9]) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aArray[9] = ' & $aArray[9] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Der Aufruf aus Zeile 5 funktioniert. In Zeile 6 habe ich den Inhalt des Indexes aufgeführt.
Hat jemand eine Idee warum die Zeile 13 dennoch nicht funktioniert?
und warum hat das seit Mitte 2019 funktioniert und seit letzter Woche nicht mehr????? -
Hallo Gemeinde,
dank des Schwester-Forums autoitscript.com ist die Lösung gefunden:AutoIt
Alles anzeigen_WinAPI_AttachConsole() Local $hConsoleOut = _WinAPI_GetStdHandle(1) Local $sMessage = "Enter [y] for deactivating MinimalLength-Option or [n] for cancel:" & @CRLF & @CRLF _WinAPI_WriteConsole($hConsoleOut, $sMessage) Local $hKBProc = DllCallbackRegister(KeyProc, "long", "int;wparam;lparam") $hKBHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKBProc), _WinAPI_GetModuleHandle(0)) While Sleep(100) Switch $iResp Case 1 ; Userinput n = no _WinAPI_WriteConsole($hConsoleOut, "Deactivating the Minimal-Length-Option was denied." & @CRLF & @CRLF & "Program is exiting in 3 seconds") Sleep(3000) Send("{ENTER}") Exit Case 2 ; Userinput y = Yes _WinAPI_WriteConsole($hConsoleOut, "Deactivating the Minimal-Length-Option is started") EraseMinlen() ; Ruft die Funktion EraseMinLen auf ExitLoop Case 3 ExitLoop EndSwitch WEnd _WinAPI_UnhookWindowsHookEx($hKBHook) DllCallbackFree($hKBProc) ;### zusätzlich wird die KeyProc func benötigt... #### Func KeyProc($nCode, $wParam, $lParam) If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hKBHook, $nCode, $wParam, $lParam) Local $tKeyHook = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam) If $wParam = $WM_KEYDOWN Then Switch $tKeyHook.vkCode Case 0x59, 0x4E ; y / n $iResp = $tKeyHook.vkCode = 0x4E ? 1 : 2 Return 1 Case 0x0D $iResp = 3 Case Else Return 1 EndSwitch EndIf Return _WinAPI_CallNextHookEx($hKBHook, $nCode, $wParam, $lParam) EndFunc ;==>KeyProc
Damit lässt sich mit der Console wunderbar interagieren auch von hier aus noch ein herzliches Dankeschön
an Nine von https://www.autoitscript.com/forum/topic/21…exe-with-a-cmd/ -
Hallo Kanashius,
vielen lieben Dank für dienen Hinweis. Er funktioniert perfekt.
Bitte entschuldige die späte Rückmeldung. Kam erst heute dazu zum testen. -
Hallo Gemeinde,
mit der Zeile $HandleHW = WinActivate("[REGEXPTITLE:(?i)(.*Pro Report.*|.*Mozilla Firefox.*)]") ermittle ich das Handle eines Firefoxtabs(der
Name des Tabs ändert sich leider immer wieder, daher RegExpTitle!) und mit WinClose($HandleHW) schliesse ich ihn. Allerdings wird der Firefox
dadurch komplett geschlossen und nicht nur der Tab.
Kann man überhaupt nur einen einzelnen Tab schliessen? -
Hallole,
danke für eure Eingaben.
@ Moombas: das ich daran nicht selbst gedacht habe...
@ water: eigentlich ja. Was uns ja wieder zur Idee von Moombas zurückführt -
Hallo Schnuffel,
das Proggi muss im Windows OS funktionieren, in Windows PE und eben als ConsolenProgramm um vollautomatisiertes Ändern oder Löschen
des BIOS-Passwortes(wir reden hier u.U. von mehreren hundert Rechnern...) zu ermöglichen. Die Möglichkeit das Proggi
mit Commandline-Parametern zu starten wurde bereits in einige unserer IT-Prozesse integriert.
Die genannte BIOS-Option verhindert das Löschen des BIOS-Passwortes. Also ist die Interaktion mit demjenigen der das Proggi ausführt notwendig.
Das Seltsame ist ja, das die Interaktion grundsätzlich funktioniert. Nur finde ich keine Lösung die "Einmischung" der Console zu verhindern...
Im Übrigen kam die Hilfe WinAPi zu benutzen hier aus dem Forum, da ConsoleWrite/Read in diesem Falle ja nicht funktioniert, weil das Proggi ja ein GUI-Programm ist.
Ich werde nun die Idee von Solvesmart verfolgen und einen weiteren Parameter dafür nutzen.
Evtl. weiss ja doch noch jemand eine Lösung? -
Hallo Solve-Smart,
da das Proggi ja in einer CMD-Console läuft, finde ich sieht es einfach komisch aus, wenn dann eine Inputbox
aufpoppt. Noch dazu, dass diese warum auch immer, nicht wie in der Hilfe steht default zentriert auf ging, sondern
i-wo auf dem Desktop...
hm, das mit dem Parameter wäre eine Möglichkeit. Danke für die Idee.
Vielleicht hat jemand trotzdem eine Idee wie ich die Benutzereingabe "umleiten" kann... -
hallo zusammen,
dann will ich nochmal das Problem beschreiben:
Mein Programm ist als exe kompiliert und kann sowohl per GUI-Version als auch in einer CMD-Konsole mit Commandline-Parametern
gestartet werden.
Nun ist es so, das eine Bios-Option (Minimal lenght) das Löschen des Biospasswortes verhindert. Der User soll also auf Consolenebene
bestätigen können, dass das Proggi diese Option deaktivieren soll um dann einen Reboot des Rechners durch zu führen.
Der Stand meines Codings ist, dass nach der Benutzereingabe auf o.a. WinApi-Frage, der Fehler kommt,
y' is not recognized as an internal or external command, operable program or batch file.
Mir ist klar warum. Die Eingabe interagiert mit der Console und nicht mit dem ausgeführten Programm. Leider finde ich
genau hierfür aber keine Lösung. Eine Inputbox habe ich schon getestet, sieht aber echt schlecht aus...AutoIt
Alles anzeigen_WinAPI_WriteConsole($hConsole, @CRLF & " MinimalLength-Option is set, which prevents the bios lock from being deleted!!! " & @CRLF & " Should the option be deactivated (restarting the computer is then mandatory)?") _WinAPI_WriteConsole($hConsole, @CRLF & " Enter [y] for deactivating ML-option or [n] for cancel: " & @CRLF) ; $hConsole ist das Handle der CMD-Session ; Benutzereingabe lesen ; Buffer erstellen, um die Eingabe zu speichern Local $tBuffer = DllStructCreate("wchar[256]") ; Buffer für 256 Zeichen Local $dwCharsRead = DllStructCreate("dword") ; Anzahl der gelesenen Zeichen ; Benutzereingabe über die WinAPI-Funktion ReadConsole lesen DllCall("Kernel32.dll", "bool", "ReadConsoleW", "handle", $hConsoleinput, "ptr", DllStructGetPtr($tBuffer), "dword", 256, "ptr", dllStructGetPtr($dwCharsRead), "ptr", 0) ; $hConsoleinput ist das Inputhandle der CMD-Session (Const $STD_INPUT_HANDLE = -10 _ $hConsoleinput = _WinAPI_GetStdHandle(0) ; Standard-Input) ; Anzahl der gelesenen Zeichen abrufen Local $iCharsRead = DllStructGetData($dwCharsRead, 1) ; String aus dem Buffer extrahieren und abschneiden Local $sInput = DllStructGetData($tBuffer, 1) $sInput = StringLeft($sInput, $iCharsRead - 2) ; Entferne das abschließende CRLF MsgBox(0, "ausgabe Input", $sInput) ; hier kommt kein Inhalt, da die Eingabe eben mit der CMD-Console interagiert.
-
Hallo Gemeinde,
eines meiner Programme kann man sowohl mit GUI starten, als auch mit commandline parametern.
Wird es mit Commandline Parametern gestartet, gebe ich Meldungen des Proggis mit _WinAPI_WriteConsole aus.
Ich müsste jetzt nachträglich den Benutzer fragen ob er eine Aktion starten möchte oder nicht. Etwa so:
Code_WinAPI_WriteConsole($hConsole, @CRLF & " MinimalLength-Option is set, which prevents the Passwort from being deleted!!! " & @CRLF & " Should the option be deactivated (restarting the computer is then mandatory)?" & @CRLF & "enter y or n:")
Gibt es eine Möglichkeit via _WinAPI, die Benutzereingabe auszulesen und zu verarbeiten?
Ich konnte zwar in der MSDN-Bibliothek etwas über ReadConsole finden(https://learn.microsoft.com/en-us/windows/console/readconsole) aber nichts dazu in AutoIt
p.s.: ConsoleWrite und -read gehen hier nicht, da das Proggi NICHT als Consolen-Anwendung kompiliert ist! -
Hallo alle miteinander,
zunächst meinen aller herzlichsten Dank für eure Beteiligung!!! Euer Einsatz möge mit dauerhaftem Sommerwetter und unbeschreiblich großem Reichtum
vergolten werden.
Die Version von Water hat natürlich auch Charme aber es macht mir den Anschein, dass es nicht zu gehen scheint, die
_GUIToolTip-Methoden anzuzeigen ohne zu hoovern. Zumindest konnte ich dafür noch keine Lösung finden.
Vielleicht hat ja Water dazu eine Idee?
Der Ballontip sollte ja gleich zu Programmstart angezeigt werden, da das Programm nur startet, wenn ein
Eintrag (Listitem verweist auf eine Datei in einem Ordner der mit FilelisttoArray ausgelesen wird, um das Listenfeld dynamisch zu erstellen. Ohne Eintrag kein Array => Programmabsturz) im Listenfeld existiert. Wenn nicht lass ich einen Dummyeintrag erstellen vor dem tatsächlichen Proggi-Start. Der Ballontip soll dann beim Anzeigen der Gui darüber informieren,
dass wenn ein weiterer Eintrag erstellt wurde, der Dummyeintrag gelöschte werden darf/kann. Dafür eignet sich die Hooverei natürlich nicht so gut. -
Hallo Zusammen,
bitte entschuldigt die späte Rückmeldung und vielen lieben Dank für eure Denkanstöße und Mühen.Ich werde den Vorschlag von Schnuffel und Solve Smart morgen mal testen.
@ water: das hatte ich auf Vorschlag von ChatGpt auch versucht aber leider nicht hinbekommen. I-wie wurde entweder der Ballontip nicht angezeigt oder an falscher Stelle. -
Hallo Gemeinde,
ist es möglich, einen BallonTooltipp unmittelbar nach dem Start einer Gui, an einer bestimmten Stelle für 10 Sekunden anzeigen zu lassen?
Beispielcode:AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <ListBoxConstants.au3> #include <GUIListBox.au3> #include <WindowsConstants.au3> Example() Func Example() Local $sMESSAGE = "||" GUICreate("My GUI list") ; will create a dialog box that when displayed is centered Local $idMylist = GUICtrlCreateList("", 64, 32, 121, 97, BitOR($WS_VSCROLL, $LBS_USETABSTOPS)) GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling GUICtrlSetData(-1, "||") GUICtrlSetData(-1, "1. Item") Local $idButton_Close = GUICtrlCreateButton("my closing button", 64, 160, 175, 25) GUISetState(@SW_SHOW) ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idButton_Close MsgBox($MB_SYSTEMMODAL, "", "the closing button has been clicked", 2) Exit EndSwitch WEnd EndFunc ;==>Example
Der Beispielcode zeigt eine Gui mit einer Listbox an, welche zwei Einträge hat.
Ich möchte, dass wenn die Gui gestartet wird, der BallontoolTip direkt angezeigt wird und auf den zweiten Eintrag (hier: 1. Item) zeigt, für
10 Sekunden.AutoIt; ich habe es mit: ToolTip("Beispieltext", x, n, "INFO", 1, 1) Sleep(10000) ToolTip("") ; versucht. Leider sind die Koordinaten x und n aber immer auf den Desktop bezogen und nicht auf das Control, bzw. die Stelle wo ich den Tip gerne hätte. Gerade auch wenn die GUI an anderer Stelle erscheint.
-
Hallo Aspirinjunkie,
werde ich gleich testen. By the way: mein Pattern funktioniert doch! Ich hatte nur vergessen, die Schleife die durch das Array geht, an der Fundstelle zu beenden.
So ist sie komplett durch und hat den Status des letzten Index ausgegeben. # vordenKopfhau # man wie doof....
Damit ist der Thread erledigt Achja: vielen herzlichen Dank für deine Unterstützung -
Hallo Aspirinjunkie,
zunächst vielen lieben Dank für deinen Beitrag. Aber so ganz stimmt deine Auslegung nicht.
Erklärung:
Ist die Bios-Option nicht aktiv, dann ist der Wert: MinimumPasswordLength, Disable.
Wenn er aber aktiviert ist, dann ist der Wert: MinimumPasswordLength,n (Wobei n eine voreingestellt Zahl größer als 4 sein kann).
Um also herauszufinden ob die Option gesetzt ist, muss ich eben nach dem Wert MinimumPasswordLength,n suchen!
Des Pudels Kern ist, dass wenn ich nach MinimumPasswordLength,4 per Arraysearch suche(sofern 4 eingestellt ist!), wird der Index gefunden.
Mit dem Pattern von StrgRegExp aber nicht.
Kann es sein, dass ich damit a) im Array gar nicht suchen kann, oder b) ob nur Strings gefunden werden und der Eintrag im Index gar kein String ist? -
Hallo Gemeinde,
ich versuche die nachfolgende Bios-Option mittels StringRegExp zu finden:
# 34|Active: True - CurrentSetting: MinimumPasswordLength,4
Es ist das Ergebnis aus _DebugArrayDisplay($aBiosArray).Code
Alles anzeigenLocal $wbemFlagReturnImmediately = 0x10 Local $wbemFlagForwardOnly = 0x20 Local $colItems = "" Local $strComputer = "localhost" Local $aBiosArray[1] Local $sindex2 = "" Local $pattern = ".*MinimumPasswordLength\s*,\s*[1-9][0-9]*.*" $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] = "Active: " & $objItem.Active & " - CurrentSetting: " & $objItem.CurrentSetting ; If MsgBox(1, "WMI-Ausgabe", $Output) = 2 Then ExitLoop ; $Output = "" Next _DebugArrayDisplay($aBiosArray) Else MsgBox(0, "WMI-Ausgabe", "Keine WMI-Objekte gefunden für Klasse: " & "Lenovo_BiosSetting") EndIf For $i = 0 To UBound($aBiosArray) - 1 If StringRegExp($aBiosArray[$i], $pattern) Then MsgBox(0, "Gefunden", "Passende Zeichenkette für " & $pattern & " gefunden!" & " - " & @error & " - " & $aBiosArray[$i]) Else MsgBox(0, "Nicht gefunden", "Kein passendes Muster für " & $pattern & " gefunden." & " - " & @error) ExitLoop EndIf Next
Das sich die Zahl hinter MinimumPasswordLength aber durchaus eine andere sein kann, wollte ich mit "$pattern" und StringRegExp nach dem Eintrag suchen.
Leider wird aber der String nicht gefunden.
Suche ich mit <$sindex2 = _ArraySearch($aBiosArray, "MinimumPasswordLength,4", 0, 0, 0, 1) ; Zahl 1 = Teilsuche > wird der Index 34 ausgegeben.
Hat jemand eine Idee warum StringRegExp den String nicht findet? -
ohhhh Mann, wer lesen kann ist klar im Vorteil.
Die Lösung: $shVar = _ExtMsgBox(128, "READY", "Cursorsetting!", "set the cursor now...", "", $x, $y, False)
Zitat: ...$bMain -> True (default) = Adjust dialog position to ensure dialog positioned on main screen
False = Dialog positioned at user-defined coords, which can be on other screens... -
Hallo Gemeinde,
ich benutze öfters die ExtMsgBox mit der gleichnamigen UDF.
Wie erreiche ich, das die ExtMsgBox immer dort angezeigt wird, wo auch das Hauptprogramm läuft.Code
Alles anzeigen_ExtMsgBoxSet(8, 1, 0xFFFFAB, Default, 14, "Bosch Sans Bold") ; Definiert aussehen der EXTMSGBOX => siehe auch _ExtMsgBox_Edit.au3 ; Beispiel-Aufruf der Ext MsgBox im Programm: $shVar = _ExtMsgBox(128, "READY", "Cursorsetting!", "set the cursor now...", "", $x, $y) ; für x und y wurden die Werte vom Hauptproggi berechnet, gehen aber nicht If $shVar = 1 Then ; die ExtMsgBox geht immer auf dem Hauptmonitor auf Pictinsert() Else MsgBox(0, "Error", "Cursor is not at the right position. Program is terminating in 5 sec...", 5) Exit EndIf
-
Hallo Kanashius,
vielen lieben Dank für deinen Denkanstoß...