Beiträge von Schnuffel
-
-
ich würde auch sagen, dass child-Prozesse die selben Sicherheitstoken haben wie der aufrufende Prozess selbst besitzt. Wäre ja auch die Frage, welche Token soll der aufzurufende Prozess denn sonst haben. Eine Sicherheitseinstellung die administrative Token bei child-prozessen entfernt ist mir nicht bekannt.
-
ich mache das für HP Geräte damit: https://ftp.ext.hp.com/pub/caps-softpaq/cmit/HP_BCU.html
Gibt es bei allen nahmhaften Herstellern
Kann man mit Batch, PowerShell WMI und Co. nutzen.
Die Portierung zu autoit sollte ein Klacks sein.
-
hier noch ein Ansatz. Aber bitte erst ausprobieren an einem nicht so großen Verzeichnis...
AutoIt
Alles anzeigen#include <Array.au3> #include <File.au3> Global $sHDD, $sfoldername, $aOutput, $aTemp $sHDD = "C:\" $sfoldername = "Users" RunWait(@ComSpec & " /c " & "dir " & $sHDD & $sfoldername & " /A:D /Q /S /B > output.txt", @DesktopDir, @SW_HIDE) _FileReadToArray(@DesktopDir & "\output.txt", $aOutput) ;If FileExists(@DesktopDir & "\output.txt") Then FileDelete(@DesktopDir & "\output.txt") Global $aArray2[$aOutput[0] + 1][5] $aArray2[0][0] = $aOutput[0] $aArray2[0][1] = "Owner" $aArray2[0][2] = "Size" $aArray2[0][3] = "Files Count" $aArray2[0][4] = "Dir Count" For $i = 1 To $aOutput[0] $aArray2[$i][0] = $aOutput[$i] $aArray2[$i][1] = _GetOwner($aOutput[$i]) $aTemp = DirGetSize($aOutput[$i], 3) If Not @error Then $aArray2[$i][2] = $aTemp[0] $aArray2[$i][3] = $aTemp[1] $aArray2[$i][4] = $aTemp[2] EndIf Next _ArrayDisplay($aArray2) Func _GetOwner($sFile_Folder) Local $objSD, $oWMIService = ObjGet("winmgmts:") Local $oFolderSecuritySettings = $oWMIService.Get("Win32_LogicalFileSecuritySetting='" & $sFile_Folder & "'") Local $intRetVal = $oFolderSecuritySettings.GetSecurityDescriptor($objSD) If $intRetVal = 0 Then Return $objSD.Owner.Domain & "\" & $objSD.Owner.Name Else Return EndIf EndFunc ;==>_GetOwnerDas Array sollte alle Ordner rekursiv liefern alphabetisch sortiert, den Besitzer, die Größe (im Moment nicht rekursiv), Anzahl Ordner und Anzahl Dateien.
Wenn die Größe rekursiv ermittelt werden soll, dann in Zeile 19 die 3 mit einer 1 ersetzen

Bei fehlender Leseberechtigung auf einen Ordner bricht das Script bis jetzt ab. Das müsste man sich noch ansehen um das abzufangen.
-
wenn du 2 bestimmte Ordner rekursive erfassen möchtest, würde ich das so lösen:
AutoItGlobal $sSearchDir = "C:\Windows" Global $aDir_Allgemein = _FileListToArrayRec($sSearchDir & "\Web", "*", 2, 1) Global $aDir_Daten = _FileListToArrayRec($sSearchDir & "\Help", "*", 2, 1) _ArrayConcatenate($aDir_Allgemein, $aDir_Daten, 1) $aDir_Allgemein[0] = UBound($aDir_Allgemein) - 1 _ArrayDisplay($aDir_Allgemein)musst halt die Ordner und des $sSearchDir an deine Bedürfnisse abändern
PS: der Parameter $iReturn kann dir auch deine Junktions liefern

+ $FLTAR_NOLINK (16) - Link/junction folders -
Ist J:\... ein Netzlaufwerk?
verwendest du eine Batch? (.bat oder .com) ?
Wie erstellst du die Batch Datei?
Wenn mit Notepad++, dann die Sprache auf MS-Dos Style ändern und dann erst abspeichern.
In der Batch Datei würde ich folgendes schreiben:
Bei der Lösung von Aspirinjunkie kann ich mir vorstellen, dass Netzlaufwerke ein Problem darstellen könnten.Das Script läuft auch mit Netzlaufwerken.

Der von dir geschilderte Fehler ist i.d.R. ein "harter" Error eines Dll-Aufrufs, der mit irgendeinem Parameter an die Wand gefahren ist.
ich hab die Funktion von AspirinJunkie mal verschlankt und optimiert.
AutoIt
Alles anzeigen$s_Cmd = "Dir" $sParameter = "C:\Users\Oliver" $b_CmdSpec = True $WorkDir = @WorkingDir $sResult = RunCmd($s_Cmd, $sParameter , $b_CmdSpec, $WorkDir) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sResult = ' & $sResult & @CRLF) ; #FUNCTION# ====================================================================================== ; Name ..........: RunCmd() ; Description ...: runs commandline programs or cmd-command and return their output ; Syntax ........: RunCmd($s_Cmd, [$sParameter = '', [$b_CmdSpec = False, [$WorkDir = @WorkingDir]]]) ; Parameters ....: $s_Cmd - the command which should be executed (can be full command or without parameters) ; $sParameter - additional parameters for the command (also array of parameters) ; $b_CmdSpec - If true the command is interpreted as a command for cmd.exe ; $WorkDir - the working directory ; Return values .: Success: returns a string with the output ; Failure: set @error and returns a debug-string ; Author ........: AspirinJunkie ; ================================================================================================= Func RunCmd($s_Cmd, $sParameter = '', $b_CmdSpec = False, $WorkDir = @WorkingDir) Local Static $h_User32DLL = DllOpen('user32.dll') If @error Then Return SetError(1, @error, "") If $b_CmdSpec Then $s_Cmd = @ComSpec & " /c " & $s_Cmd Local $s_Ret, $s_Err If $sParameter <> '' Then If IsArray($sParameter) Then Local $s_Par = "" For $j In $sParameter $s_Par &= " " & $j Next $sParameter = $s_Par Else $sParameter = ' ' & $sParameter EndIf EndIf Local $iPID = Run($s_Cmd & $sParameter, $WorkDir, @SW_HIDE, 0x2 + 0x4) If @error Then Return SetError(2, @error, "") ProcessWaitClose($iPID) $s_Ret = DllCall($h_User32DLL, 'BOOL', 'OemToChar', 'str', StdoutRead($iPID), 'str', '')[2] $s_Err = DllCall($h_User32DLL, 'BOOL', 'OemToChar', 'str', StderrRead($iPID), 'str', '')[2] If $s_Err <> "" Then Return SetError(3, 0, "------- StdOut -----------" & @CRLF & $s_Ret & @CRLF & @CRLF & "------- StdErr -----------" & @CRLF & $s_Err) EndIf Return $s_Ret EndFunc ;==>RunCmd -
so, ich hab mal investigiert.
Die für dich einfachste Lösung wäre _WinAPI_SetParent().
Du musst nur die Position einmalig berechnen, sofern sich die Anzahl Buttons in der Leiste von SciTE nicht zur Laufzeit ändert.einfaches Bespiel:
AutoIt
Alles anzeigen#include <WinAPISysWin.au3> #include <WindowsConstants.au3> Opt('WinTitleMatchMode', 2) Local $hParent = WinGetHandle(' SciTE') Local $hForm = GUICreate('', 60, 20, 350, 2, $WS_POPUP, $WS_EX_TOOLWINDOW) Global $Btn1 = GUICtrlCreateButton('1',0,0,20,20) Global $Btn2 = GUICtrlCreateButton('2',22,0,20,20) _WinAPI_SetParent($hForm, $hParent) GUISetState() Global $nMsg While 1 $nMsg = GUIGetMsg() Switch $nMsg Case -3 Exit Case $Btn1 MsgBox(262144, 'Btn 1', 'Btn 1') Case $Btn2 MsgBox(262144, 'Btn 2', 'Btn 2') EndSwitch WEndAchja, sämtliche Interaktion inkl. Größenänderung via PopupHost und Co, machen die Buttons direkt (auch in der Vorschau) gleich mit

-
☺️ ich hab gestern auch als erstes versucht den code zu verschlanken. hatte aber zu wenig zeit. ich versuche heute deinen code weiter zu betrachten.
-
schau ich mir heute abend an
-
ich unterstütze dich gern wo ich kann, brauche dazu aber deinen code

-
aber wenn du mein erstes Script anwendest, dann kannst du doch den WinTitle und die HexCodes extrahieren und danach filtern.
siehe:
grafik.pngwenn dein ActiveWindows danach Scite Ist, dann musst du neu zeichnen.
Ich dachte damit kann man das abfangen
-
ich hab mir mit obigen funktion die WindowTitle mit ausgegeben .
Da tauchte das auf wenn ich über das Fensteranordnungs-Tool die Gui verschoben habe.
-
-
falls jemand da weiterhelfen will/kann.
Hier mal die Referenz von ABAP (die Programmiersprache in der SAP geschrieben wurde)
ABAP - Referenz - ABAP-Schlüsselwortdokumentation
und hier mögliche Connectoren:
Es scheint wohl auch über ComObject zu funktionieren. Erspart den zu bezahlenden Connector.

siehe: https://www.autoitscript.com/forum/topic/40…comment=1517795
-
-
ein recht rudimentärer Ansatz auf den ich so nicht sofort gekommen wäre. mea culpa
Ich denke wenn es für dich deine Anforderung erfüllt ist ja alles prächtig.
mir ist unklar wir das rtf-Format Textdrehung verarbeitet, aber wie gesagt wenns klappt ist alles gut.
-
ich denke nein.
Warum muss es denn das rtf / doc Format sein?
In pdf ist das sicher einfacher erstellt

-
für html empfehle ich die Lektüre von: https://wiki.selfhtml.org
Ist immer etwas schwierig, wenn man mit der einen Sprache (AutoIt) eine andere Sprache erstellen will(html)
Da kommt man gerne durcheinander, auf welcher Ebene man gerade welchen Tag anwenden muss ...
-
zum Beispiel so:
AutoIt
Alles anzeigenOpt('MustDeclareVars', 1) #include-once #include <Array.au3> #include <WinAPIConv.au3> ; Array heißt $aWeine Global $aWeine[][5] = _ [ _ ['02', '1 ', '2021er Silvaner, trocken ', ' 5,00 €', ' 5,00 €'], _ ['01', '10 ', '2022er Gutenberger´s Winzerschoppen, lieblich', ' 5,00 €', ' 50,00 €'], _ ['04', '100 ', '2021er Müller-Thurgau u. Silvaner, lieblich', ' 5,00 €', ' 500,00 €'], _ ['08', '1000 ', '2022er Blauer Spätburgunder Rosé, lieblich', ' 5,00 €', ' 5000,00 €'], _ ['07', '1 ', '2022er Rotling, halbtrocken', ' 10,00 €', ' 10,00 €'] _ ] ;MsgBox(0,"Alle Artikel", $AlleArtikel) _ArrayDisplay($aWeine) ;~ For $Col = 0 to $Cols - 1 ;wird nur benötigt wenn die Spalten überschriften haben ;~ $AlleArtikel &= '<th>' & $aWeine[0][$Col] & '</th>' ;~ Next Global $Wert, $Rahmen = 'style="border: 1px solid black;"' ; Tabellen-Rahmen in schwarz Global $Tabelle = '<table>' ; Tabelle For $Row = 0 To UBound($aWeine, $UBOUND_ROWS) - 1 $Tabelle &= '<tr>' & @CRLF For $Col = 0 To UBound($aWeine, $UBOUND_COLUMNS) - 1 $Wert = BinaryToString(StringToBinary($aWeine[$Row][$Col], 1), 1) ; Somit sind Umlaute oder Zeichen wie "´" okay If $Col = 0 Then $Tabelle &= '<td style="border: 1px solid black;text-align: center;">' & $Wert & '</td>' & @CRLF ElseIf $Col = 2 Then $Tabelle &= '<td style="border: 1px solid black;text-align: left; padding-left:10px;">' & " " & $Wert & '</td>' & @CRLF Else $Tabelle &= '<td style="border: 1px solid black;text-align: right;">' & $Wert & '</td>' & @CRLF EndIf Next $Tabelle &= '</tr>' & @CRLF Next $Tabelle &= '</table>' ConsoleWrite($Tabelle & @CRLF) -
sollte das Problem weiträumiger sein brauchen wir den vollständigen code.