Auf welche Größe sind die Strings mit den man arbeiten darf, bei _ArraySearch() begrenzt? Dürfen Sonderzeichen und Umlaute in den Strings enthalten sein?
Beiträge von Scritch
-
-
Ja, das auszuwerten ist in der Tat furchtbar. Die Datei stammt direkt aus der Microsoft Registry aus der Exportieren-Funktion. Da kann man auch das Dateiformat .txt halt auswählen.
Jetzt wo ich das hier schreibe und gerade nochmal in den Code geschaut habe, gebe ich dir natürlich Recht. Anfängerfehler. Wie du richtig gesehen hast, werte ich immer nur die 3 Zeilen aus, obwohl die Daten auch in Zeile 4, 5, 6,... stehen. Blöder Fehler :pinch:
Aber dann hast du mir jetzt doch noch geholfen, ih n zu finden. Dafür danke ich dir

Mal schauen ob er dann den ganzen binären Krams auch richtig auswertet.
Edit: Aber um das nochmal zu klären: Wie groß darf ein Array Datenfeld maximal sein?
-
Mit Typumwandlungen arbeite ich nicht. Hier mal mein Skript, ist vom umfang noch überschaubar. Daten werden wie gesagt aus einer Textdatei ins Array eingelesen und auch ohne große Umwandlungen weiter verarbeitet.
Spoiler anzeigen
[autoit]#include <file.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <array.au3>Global $Reg_vorher = @ScriptDir & "\reg_vorher.txt"
[/autoit] [autoit][/autoit] [autoit]
Global $aReg_vorher ;Pure eingelesene Registry in eine 1D-Arraydim $aAufteilung[2][4] ;Schlüsselname|Klassenname|Letzter schreibzugriff
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_filereadtoarray($Reg_vorher, $aReg_vorher)for $i = 0 to UBound($aReg_vorher) - 1
[/autoit]
if StringInStr($aReg_vorher[$i], "Schlüsselname") > 0 Then
redim $aAufteilung[ubound($aAufteilung) + 1][ubound($aAufteilung, 2)]
$aAufteilung[ubound($aAufteilung) - 1][0] = StringMid($aReg_vorher[$i], 15) ;Schlüsselname
$aAufteilung[ubound($aAufteilung) - 1][1] = Stringmid($aReg_vorher[$i + 1], 13) ;Klassenname
$aAufteilung[ubound($aAufteilung) - 1][2] = Stringmid($aReg_vorher[$i + 2], 24) ;Letzter Schreibzugriff
ElseIf StringInStr($aReg_vorher[$i], "Wert") > 0 Then
$Werthoehe = StringMid($aReg_vorher[$i], 5)
if $Werthoehe = 0 Then
$aAufteilung[ubound($aAufteilung) - 1][3] = $aReg_vorher[$i + 1] & $aReg_vorher[$i + 2] & $aReg_vorher[$i + 3]
Else
if ubound($aAufteilung, 2) >= (4 + $Werthoehe) Then
$aAufteilung[ubound($aAufteilung) - 1][3 + $Werthoehe] = $aReg_vorher[$i + 1] & $aReg_vorher[$i + 2] & $aReg_vorher[$i + 3]
Else
ReDim $aAufteilung[ubound($aAufteilung)][4 + $Werthoehe] ;vorher prüfen, ob array schon groß genug
$aAufteilung[ubound($aAufteilung) - 1][(3 + $Werthoehe)] = $aReg_vorher[$i + 1] & $aReg_vorher[$i + 2] & $aReg_vorher[$i + 3]
EndIf
EndIf
EndIf
Next
_arraydisplay($aAufteilung)Edit: Hier habt ihr nochmal eine abgespeckte Datei von der Registry, wo man das nachstellen kann:
-
Ich weiss gerade nicht, wie ich das als Minibeispiel darstellen soll. Ich versuche es nochmal zu erklären:
Es geht wieder darum, die Registry auf Änderungen hin auszuwerten. Dabei hat man dann Inhalte von den Datenfeldern (die Registry wird aus einer Textdatei in ein Array eingelesen) wie diese hier:Spoiler anzeigen
Schlüsselname: HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 2\SCSI Bus 0\Target Id 0\Logical Unit Id 0
Klassenname: <KEINE KLASSE>
Letzter Schreibzugriff: 14.08.2012 - 08:04
Wert 0
Name: Type
Typ: REG_SZ
Daten: CdRomPeripheralWert 1
Name: DeviceType
Typ: REG_SZ
Daten: CdRomPeripheralWert 2
Name: Identifier
Typ: REG_SZ
Daten: MagicISOVirtual DVD-ROM 1.0AWert 3
Name: InquiryData
Typ: REG_BINARY
Daten:
00000000 05 80 02 02 20 00 00 10 - 4d 61 67 69 63 49 53 4f .... ...MagicISO
00000010 56 69 72 74 75 61 6c 20 - 44 56 44 2d 52 4f 4d 20 Virtual DVD-ROM
00000020 31 2e 30 41 1.0AWert 4
Name: DeviceName
Typ: REG_SZ
Daten: CdRom1
Genau so steht es in der Textdatei. Und so wie es in der Textdatei steht, will ich es auch auswerten. Ich wollte diesen String jetzt teilen in verschiedene Strings und das in ein anderes Array schreiben. Schlüsselname, Klassenname und Letzter Schreibzugriff jeweils in eine Spalte und danach dann die Inhalte der jeweiligen Werte je in eine Spalte. Aber da scheiterts. Name und Typ werden korrekt geschrieben. Die Daten jedoch nicht. Hinter Daten steht dann später gar nichts. -
Hallo. Nachdem ich ja norlich schonmal Probleme mit der generellen Größe eines Arrays hatte, habe ich nun Probleme mit der Inhaltsgröße eines Datenfeldes. Ich habe einen binären inhalt mit 84.000 Zeichen. Im _ArrayDisplay wird das nicht angezeigt. Bzw. generell keine Zeichenfolgen wie diese hier:
Spoiler anzeigen
00000000 00 00 00 00 00 00 00 00 - 01 00 00 00 02 00 00 00 ................
Wie kann das sein?
-
Das ist so von mir gedacht, dass das ganze dann in einem Array stehen wird, welches dann nur in eine Datei geschrieben wird. Ich brauche das ganze eigentlich auch nur um ein schon vorhandenes Skript zu erweitern.
-
Die neue Methode ist aber in der Tat deutlich flotter, nur was nutzt einem das, wenn die Hälfte des Arrays nicht angezeigt wird...

Schön wärs
Bei mir werden gerade etwas mehr als 2% des Arrays angezeigt bei 65k Einträgen.Ich werde es dann einfach in die Konsole ausgeben lassen

-
Prinzipiell kein Problem, mit zusätzlicher Software. Ist aber immer nicht so gern gesehen bei uns im unternehmen für jede Kleinigkeit weiter Software zu benutzen. AutoIt benutzen wir schon in vielen Fällen und es wäre toll, wenn man dabei bleiben könnte
Ich werde mir das dennoch mal anschauen, danke dir 
-
Hatte das ganze bei mit unter Vista 64bit aber auch als 32bit Anwendung erfolgeich getestet, also vllt eher ein Limit von XP bzgl. Listviews?
Letzten Endes für dein vorhaben aber irrelevant, denn es ist ja nicht notwendig die komplette Registry per arraydisplay darzustellen, es langt ja die unterschiede beider Arrays zu ermitteln und anzuzeigen.
Da hast du Recht, für mein Projekt irrelevant
_ArrayDisplay ist aber für die Kontrolle bisher trotzdem immer ganz nett gewesen. -
Wo hast du denn diese Grenze von 65530 her?
[autoit]
Es ist bei mir problemlos möglich 3.000.000 Array-Elemente zu erstellen und auch zu nutzen:Global $a_Test[3000000]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$a_Test[2999999] = "Test"
[/autoit]
ConsoleWrite($a_Test[2999999] & @CRLF)Du hast Recht, das Anzeigen von Elementen aus Spalten jenseits der 65.530 funktioniert. Scheint wirklich die max. Grenze von _ArrayDisplay sein unter einem 32Bit OS.
-
Klar kann man. Das Limit bezieht sich auf Controls, ein Listview ist genau 1 Control. Aber beim testen eben ist mir aufgefallen, dass große Arrays extrem viel Arbeitsspeicher bei der Listviewerstellung fressen. Das kann dann ggf. auch mit dem maximal addressierbaren Arbeitsspeichers von 32bit Anwendungen kollidieren.
Ok, dann kollidierts mit meinem 32 Bit OS

-
Naja, vll. hat _ArrayDisplay auch eine Begrenzung?
[autoit]#include <array.au3>
[/autoit]
dim $aTest[1000000]
_arraydisplay($atest)
Da zeigt er mir nur 65.530 Datenfelder an, in der ersten Dimension. -
Hallo. Ich möchte ein Array erstellen welches mehr Einträge beinhaltet als es bisher vorgesehen ist. Derzeitige Größe ~3.000.000. Ist das irgendwie machbar?
-
Du kannst doch die Registry speichern.
Schlagwort wäre: bevor & after
Speichere erst die Registry unter "bevor", dann z. B. Programm installieren und dann die Registry speichern unter "after".
Hast Du das gemacht, vergleiche beide Dateien und die Unterschiede läßt Du in eine Datei schreiben. Mit der richtigen Endlung kannst Du es sogar so machen, das die neuen Einträge, wenn Du sie z. B. manuell löscht, durch anklicken wieder in die Registry einspielst.
Aber sei vorsichtig, denn die Registry ist das Herzstück jedes Windowscomputers.Wie das geht mit in Datei speichern und vergleichen, findest Du alles bereits im Forum und ind er Hilfe.
Ja, das ist ja auch mein Plan. Aber ich bekomme ja nichtmal die komplette Datei in ein Array für die Bearbeitung, da bei Arrays bei 65.530 Einträgen Schluss ist. Es scheitert also schon am Anfang. 2.961.601 Einträge sollte es eigentlich haben :-O
-
Hallo. Ich möchte gerne ein Tool haben/selber bauen welches die Registry in zwei verschiedenen Zuständen vergleicht und mir Diferenzen auflistet. Ich erfasse z. B. vor der Installation eines Programmes den Zustand, also sämtliche Inhalte der Registry. Dann installiere ich mein gewünschtes. Danach möchte ich halt gerne sehen was sich in der Registry geändert hat.
Kennt da jemand was? Ich weiss nicht ob das mit AutoIt realisierbar wäre. Theoretisch würde es ja gehen. Die Registry exportieren in eine Textdatei, jeweis vorher und nachher. Und dann einfach die einzelnen Zeilen miteinander vergleichen. Tja, theoretisch. Praktisch sind das aber 180MB an reinen Text, was nicht mal eben verarbeitet werden kann. Über eine Million an Zeilen. -
Kann mir keiner helfen?

-
Hallo. Ich hatte mir vor einiger Zeit für unsere Firma ein Script geschrieben um bei Usern ohne Adminrechte auch Drucker installieren zu können, ohne dass er sich abmelden muss. Das klappte bisher auch ganz gut und zufriedenstellend. Hier ein kleiner wesentlicher Ausschnitt aus dem Script:
Spoiler anzeigen
[autoit]Func Combo2()
[/autoit] [autoit][/autoit] [autoit]
$read = GUICtrlRead($Combo2)
DirCreate($driver_path)
While 2
If $read = "Service" Then
Global $treiberexe = "E350.exe"
Global $treibername = $driver_path & "LMAAL2DA.INF"
Global $druckername = "Lexmark E352dn PS3"
Global $druckerport = "nwd-service"
FileInstall("./E350.exe", $driver_path & $treiberexe, 1)
ExitLoop
EndIfWEnd
[/autoit] [autoit][/autoit] [autoit]
installdriver($read, $treiberexe, $treibername, $druckername, $druckerport)
EndFuncFunc installdriver($read, $treiberexe, $treibername, $druckername, $druckerport)
[/autoit]
Global $driver_path = @ScriptDir & "\tmp\"
Global $print_vbs = $driver_path & "vbs.exe"
Global $driver_x86 = $treiberexe
Global $driver_inf = $treibername
Global $driver_current = $druckername
Global $driver_old = $druckername
Global $print_port = $druckerport
Global $script_v = FileGetVersion(@ScriptFullPath)
Global $driver
Global $driver_processor
Global $driver_typ
FileInstall("./vbs.exe", $PRINT_VBS, 1)
$driver = $driver_path & $driver_x86
$driver_processor = "Intel"
;Entpacke den Treiber an die vordefinierte Stelle
ShellExecuteWait($driver, '-d"' & $driver_path & '" -s2')
;Entpacke die VBS's an die vordefinierte Stelle
ShellExecuteWait($print_vbs, '-d"' & $driver_path & '" -s1')
RunWait('cscript "' & $driver_path & 'prnport.vbs" -a -r ' & $print_port & ' -h ' & $print_port & ' -o raw -n 9100', $driver_path, @SW_HIDE)
RunWait("rundll32 printui.dll,PrintUIEntry /if /b " & '"' & $druckername & '"' & " /f " & '"' & $driver_inf & '"' & " /r " & '"' & $print_port & '"' & ' /m ' & '"' & $driver_current & '"')
;RunWait('rundll32 printui.dll,PrintUIEntry /if /b "Lexmark T430 PS" /f "' & $driver_inf & '" /r "' & $print_port & '" /m "' & $driver_current & '"')
sleep(1000)
Run(@ComSpec & " /c " & "rundll32 printui.dll,PrintUIEntry /Xs /n " & '"' & $druckername & '"' & " printername " & '"' & $read & '"', "", @SW_HIDE);Benennt den gerade installierten Drucker so um, damit man ihn besser erkennen kann
_GUICtrlListBox_AddString($cList, $read);Fügt den neuen Drucker in der Liste in der GUI hinzu
GUICtrlSetData($statuslabel, "Der Drucker " & $read & " wurde erfolgreich installiert")
DirRemove($driver_path, 1)
EndFunc
Nun haben wir aber auch andere Drucker und damit auch andere Treiber bekommen. Wir verwenden nun nur noch Universaltreiber. Nach der Installation dieser Treiber muss man aber noch händisch die einzelnen Funktionen des Druckers im Druckertreiber zuordnen. Das geht wieder nur unter der Adminkennung. Meine Frage nun an euch ist, ob so Konfigurationen wie das Hinzufügen einer Duplexeinheit (ich sage dem Treiber quasi dass der Drucker duplex drucken kann) auch über AutoIt machbar ist?Wahrscheinlich ist das ja nur ein zusätzlicher Parameter der gesetzt werden muss.
Und noch etwas: Wir haben hier parallel sowohl als auch Drucker mit USB-Anschluss bei uns im Einsatz. Die Treiberinstallation funktion über meine Methode nur mit Paralleldruckern. Wie kann ich auch Drucker mit USB-Anschluss auf diese Art und Weise installieren?
-
Das bezweifle ich nicht, dass das von hand auch zügig "von der Hand" geht. Sicherlich ist das für 10, 20, 30 Fotos auch kein Aufwand, wenn man erstmal den Ablauf dafür drauf hat. Wenn es nachher aber doch einge Bilder mehr werden (genaue Zahl kann ich nicht sagen), wäre es doch schön, wenn man einen Automatismus drin hätte.
Das ganze mit AutoIt zu ergänzen wäre natürlich auch eine feine Sache! -
Danke für deine Antwort. Stimmt, an so Profisoftware habe ich gar nicht gedacht. Nunja, habe gerade mal geschaut, aber ich dachte Photoshop wäre teurer. Kostet ja "nur" um und bei 80€. Was für Plugins wären da denn noch nötig? Und was meinst du mit halbautomatisch? Halbautomatisch kann ich das auch mit Paint, die gesichter mit der Ausschneidenfunktion ausschneiden

Solche semiprofessionellen, kostenlosen Programme wie Gimp haben das nicht drauf? Mir geht es halt darum, dass ich nicht jedes Gesicht einzelnd ausschneide möchte. Ist es ausserdem möglich gesichtserkennung zu machen bei Gesichtern auf Fotos, die nur von der Seite zu erkennen sind?Ich glaube das entwickelt sich doch eher in Richtung Offtopic hier. Mag den Thread ein Mod mal bitte verschieben?
-
Hallo. Ich möchte mir ein Skript bauen, dass auf Fotos gesichter erkennt, diese ausschneidet und dann das ausgeschnittene Bild in einer .jpg speichert. Dabei sollte wirklich nur das Gesicht und die Haare später ausgegeben werden, also sämtliche Dinge die vll. noch ansatzweise im Hintergrund zu sehen sind, sollten weiß sein. Ich bin mir dessen bewusst, dass das nicht ganz einfach zu bewerkstelligen ist. Ein paar Ansätze von anderen Usern habe ich bereits hier gefunden. Die sind aber nicht wirklich zuende geführt wurden.
Welches wäre der einfachste Weg den ich dafür einschlagen sollte?
OT: Gibs evt. andere Programme die mein Vorhaben schon von haus aus so umsetzen können?