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.
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...
#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 ;==>_GetOwner
Alles anzeigen
Das 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:
Global $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.
$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
Alles anzeigen
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:
#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
WEnd
Alles anzeigen
Achja, 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
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:
Opt('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)
Alles anzeigen
sollte das Problem weiträumiger sein brauchen wir den vollständigen code.
hier mal dein vollständiger Code etwas aufgeräumt:
Opt('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
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)
Alles anzeigen
pls, stell auch das entsprechende Script mit ein, dann können wir daran "arbeiten"