Generell Probleme habe ich nicht. Das sind jetzt bloß Dinge, die mit Arrays vorher nicht angestellt habe und ich mich daher bischen mit schwer tue. Das Tut kenne ich schon, schaue auch ab und zu mal wieder rein, trotzdem danke für den Hinweis ![]()
Beiträge von Scritch
-
-
Wie ist denn die max. Stringlänge in einem Array?
-
Klasse, war alle bisherige Arbeit fast vergebens
Aber danke für die info, überlege mir dann eine andere Lösung. -
Joa... teilweise klappts bei mir, nur beendet sich das Skript mit folgender Fehlermeldung nach einiger Zeit:
"error allocating memory"
Array zu groß? Mit 4GB RAM sollte bei 200 Spalten und teilweise je Spalte ca 60 Zeichen eig. nicht Schluss sein, oder? :pinch:Mal eine kurze Erläuterung zum Skript: Habe auf mehreren PCs eine .ini vorliegen, wo die inst. Software gespeichert ist.
ich möchte eine Auswertung von allen PCs und aller Software machen und dabei auflisten, auf welchem PC welche
Software installiert ist und wie oft jedes Programm (wegen der Lizenzen) vorhanden ist.Dabei ist es halt so dass in der ersten Spalte das Softwareprodukt steht (meinetwegen Firefox). Das ist nun auf jedem Rechner
installiert. Alle Rechner auf denen das installiert ist, werden nun in die 4 Spalte geschrieben, in ein "Kästchen" damit das später
in einer .csv-Datei alles schön sortiert dargestellt werden kann. Und da kommt dann halt die besagte Fehlermeldung, wenn
schon bischen was im Array steht... -
Okay, dann mal bischen genauer

Also, das Array wird in einer Schleife "gefüllt". Nach dem ersten Durchgang würds ungefähr so aussehen:
spalte1 spalte2
(auto12)(auto34)
(auto56)(auto78)Im nächsten Durchlauf der Schleife wird aber in Spalte2 wo auto34 drinnen steht, ein neuer Eintrag rein-
geschrieben. Dieser neue Eintrag soll aber den alten nicht ersetzten, sondern zusätzlich in dem gleichen
Feld stehen. Quasi so:spalte1 spalte2
(auto12)(auto34, auto9)
(auto56)(auto78)In den Datenfeldern können nachher auch bis zu 130 Einträge stehen
* Einträge in Klammern sind ein Datenfeld
-
Hallöchen.
Nun habe ich ja schon gelernt, wie man ein Array dynamisch verändert und promt stehe ich vorm nächsten Problem:
Ich habe ein 2D Array. Habe nun in einem Feld schon einen Wert stehen, wo später aber noch einer hinzukommen soll.
Wie stelle ich das an?
-
Ok, also so?!:
[autoit]Dim $csv[2][4]
[/autoit]
for $c = 0 to UBound($csv) - 1
for $d = 0 to ubound($csv) - 1
If $csv[$c][$d] = '' Then
for $b = 0 to ubound($asoftware) - 1
$csv[$b][0] = $asoftware[$b]
ReDim $csv[ubound($asoftware) + 1][4]
_ArrayDisplay($csv)
Next
EndIf
Next
NextEdit: Funktioniert nicht
Narf... -
Ich möchte ein Array kontrollieren, ob in diesem schon was drinnen steht, bzw. eine einzelne Spalte (Das Array ist 2D)
[autoit]
Wie stelle ich das am besten an? Mit dem Bsp. aus BugFix's Tut kann ich leider nicht viel mit anfangen:Local $array[1] ; Array hat zum Programmstart 1 Element
[/autoit]
$newData = GUICtrlRead($Input)
If $newData <> '' Then ; prüfen ob nicht leer
; der erste Eintrag soll in das bestehende 1. Array-Element eingetragen werden, z.Zt. das letzte
; für weiter Einträge muß das Array vorher um ein Element vergrößert werden
If $array[Ubound($array)-1] <> '' Then ; ist das letzte Element NICHT leer (dann ist es NICHT das erste)
ReDim $array[Ubound($array)+1] ; Arraygröße neu: 1 größer als aktuelle Größe Ubound($array)
EndIf
$array[Ubound($array)-1] = $newData ; Daten in das letzte Element schreiben, im ersten Durchlauf ist dies das erste.
EndIf -
Eine Idee schon, auch wenns nicht die schönste ist: Schreibe deine Variable in eine Datei aus der Batchdatei und lese die Datei in Autoit wieder ein.
-
Bei allen For-Schleifen die ich bei dir gesehen habe ignorierst du immer das 1. Element.
Hat den Grund, weil in der ersten Zeile die Größe des Arrays stand. Und das ist ein Eintrag, den ich nicht brauche.
-
Hab dein Skript mal auf einen wesentlichen Aspekt hin verkürzt - was fällt dir dabei auf?:
Ausser dass mein Array nur einen Eintrag hat und dass das in einer Schleife abzuarbeiten ziemlich blödsinnig ist, nichts... (Zur Verteidigung: Das Array ist normal größer)
Ich verstehe es so das du ein 2D-Array erstellen willst und gleich direkt eine Spalte mit dem Inhalt eines 1D-Arrays befüllen willst.
Genau das möchte ich!
Warum du in der Schleife immer ein neues Array erstellst (dim) ist mir zwar nicht klar
Jetzt wo dus sagst: Bischen schwachsinnig, ja :pinch:
in der 2. Dimension sollte schon eine Zahl größer 0 stehen
Hatte irgendwie im Kopf, dass da die Zählweise von links auch bei 0 anfängt, wie bei den Spalten.
Vielleicht zur Verständnis nochmal der angesprochene 2-Zeiler
Ok, danke dafür. Habs jetzt glaube ich... wenigstens zum Teil...
[autoit]Dim $csv[30][4]
[/autoit]
for $b = 1 to ubound($asoftware) - 1
$csv[$b][1] = $asoftware[$b]
_ArrayDisplay($csv)
NextEdit: Ich möchte es jetzt nur noch so haben, dass ich die Arraygröße vorher nicht bestimmen brauche... Ich bastel mal weiter.
Edit2: Habs jetzt so wie ich es haben wollte, danke für die Hilfe:
[autoit]Dim $csv[2][4];Größe des Arrays (Sollte dynamisch angepasst werden)
[/autoit]
for $b = 1 to ubound($asoftware) - 1
$csv[$b][1] = $asoftware[$b]
ReDim $csv[ubound($asoftware) + 1][4]
_ArrayDisplay($csv)
Next -
Soo:
Spoiler anzeigen
[autoit]#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <file.au3>dim $pcname[1] = ["pcname"]
[/autoit] [autoit][/autoit] [autoit]
Local $csvpfad = @ScriptDir & "\test.csv"
Local $open = FileOpen($csvpfad, 0)
;~ global $csv2array = _CSV2Array($open, Default, True, 1)
FileClose($csvpfad)
;_ArrayDisplay($csv2array)For $a = 1 To UBound($pcname) - 1
[/autoit]
$onlinestatus = Ping($pcname[$a],500) ; onlinestatus abfragen für schnellere verarbeitung
If $onlinestatus Then
Local $software = "\\" &$pcname[$a] & "\d$\HaSo\software.ini"
Global $asoftware
_FileReadtoarray($software, $asoftware) ;Erste Softwareliste wird eingelesen und gleich in die .csv geschrieben
for $b = 1 to ubound($asoftware) - 1
dim $csv[$b - 1][0] = $asoftware[$b]
_ArrayDisplay($csv)
Next
EndIf
NextIch lese hier eine Liste mit installierter Software von einem anderen Computer in ein array ein. Dann möchte ich diese Liste an
[autoit]
Software gerne in ein anderes Array, in die erste Spalte haben. Das habe ich mitfor $b = 1 to ubound($asoftware) - 1
[/autoit]
dim $csv[$b - 1][0] = $asoftware[$b]
_ArrayDisplay($csv)
Next
versucht. Das sagt mir Autoit aber immer "badly formated". Ich komme einfach nicht drauf, was ich verkehrt mache
-
Ja, einfach selbst schreiben, ganz einfach
Ich habe hier eine Teillösung gefunden, ist aber kein 2 Zeiler
und ich weiß auch noch nicht, wie ich in die 2 Spalte Werte reinbekomme.Spoiler anzeigen
[autoit]$sMsg = "Add a single element to a 2D array:" & @CRLF
[/autoit] [autoit][/autoit] [autoit]
Global $avTesting[3][2] = [[1, 2],[3, 4],[5, 6]]
$RET = __ArrayAdd($avTesting, "Test")
$iErrSav = @error
$iExtSav = @extended
_ArrayDisplay($avTesting, "$avTesting")Func __ArrayAdd(ByRef $avArray, $vValue, $NestArray = True)
[/autoit]
Local $iBoundArray0, $iBoundArray1, $iBoundArray2, $iBoundValue1
If IsArray($avArray) = 0 Then Return SetError(1, 0, -1); $avArray is not an array
$iBoundArray0 = UBound($avArray, 0); No. of dimesions in array
If $iBoundArray0 > 2 Then Return SetError(1, 1, -1); $avArray is more than 2D
$iBoundArray1 = UBound($avArray, 1); Size of array in first dimension
If $iBoundArray0 = 2 Then $iBoundArray2 = UBound($avArray, 2); Size of array in second dimension
If ($iBoundArray0 = 1) Or (IsArray($vValue) = 0) Or $NestArray Then
; If input array is 1D, or $vValue is not an array, or $NestArray = True (default) then save $vValue literally
If $iBoundArray0 = 1 Then
; Add to 1D array
ReDim $avArray[$iBoundArray1 + 1]
$avArray[$iBoundArray1] = $vValue
Else
; Add to 2D array at [n][0]
ReDim $avArray[$iBoundArray1 + 1][$iBoundArray2]
$avArray[$iBoundArray1][0] = $vValue
EndIf
Else
; If input array is 2D, and $vValue is an array, and $NestArray = False,
; then $vValue is a 1D array of values to add as a new row.
If UBound($vValue, 0) <> 1 Then Return SetError(1, 2, -1); $vValue array is not 1D
$iBoundValue1 = UBound($vValue, 1)
If $iBoundArray2 < $iBoundValue1 Then Return SetError(1, 3, -1); $vValue array has too many elements
ReDim $avArray[$iBoundArray1 + 1][$iBoundArray2]
For $n = 0 To $iBoundValue1 - 1
$avArray[$iBoundArray1][$n] = $vValue[$n]
Next
EndIf
; Return index of new last row in $avArray
Return $iBoundArray1
EndFunc ;==>__ArrayAdd
Ich probiers mal mit dem alleine schreiben
-
Hallo,
dazu gibs schon ein Lösung: https://autoit.de/index.php?page…&highlight= -
Hallo,
ich möchte einen Eintrag zu einem 2D-Array hinzugügen. Die Hilfe sagt ja, dass bei _ArrayAdd nur mit 1D-Arrays gearbeitet werden kann. Welche 2D-Alternative gibt es hierzu? -
Entschuldige die blöde Frage, aber wie verwende ich dein Script?
Neues Script und ausführen bringt irgendwie nichts
Ich habe verschieden rundll32-Befehle direkt auf Kommandozeile ausprobiert.
Heute bekomme ich eine andere Fehlermeldung, beim Öffnen der Druckereigenschaften.
"die druckereigenschaften können nicht angezeigt werden. entwerder der eingegeben druckername ist ungültig, oder der angegeben drucker ist nicht mehr mit dem server verbunden."
Weiß nicht was ich damit anfangen soll. Druckernamen habe ich copy paste eingefügt und der Drucker ist immernoch da!Edit: "Der Druckerwarteschlangedienst wird nicht ausgeführt" ... Was hat das nun wieder zu bedeuten?!
Edit2: Warteschlangendienst ist "gestartet"... -
Ich möchte bloß einen Drucker löschen, kan allerdings lokal wie auch netzwerk sein. Habe beides im Einsatz.
-
Schön und gut, bringt mich bei meinem Problem aber nicht weiter.
Ist das gleiche wenn ich "rundll32 printui.dll PrintUIEntry /?" auf der
Kommandozeile eingebe... Nur noch mit einer Einleitung... -
Hallöchen,
habe ein kleines Problemchen mit meiner Druckerverwaltung. Ich wollte Drucker gerne per Script bzw. über die Kommandozeile löschen. Das bringt Windows ja von Haus aus schon mit.rundll32 printui.dll,PrintUIEntry /gd /c\\Computer /n\\Computer\Drucker
Wenn ich es jetzt meinen Bedürfnissen anpasse, bekomme ich nur eine Fehlermeldung. Sonst passiert nichts.
Also:
rundll32 printui.dll,PrintUIEntry /gd /c\\meinPC /n\\meinPC\Lexmark T430 PS
Fehlermeldung:
"Pro Maschine Druckerverbindungen können nicht gelöscht werden. Der Vorgang konnte nicht abgeschlossen werden."Das geschieht bei lokalen und bei Netzwerkdruckern. Wie kann das sein?
-
Hallo,
vll. eine etwas komische Frage, aber ich frage sie dennoch: Wenn ich ein Array in Autoit erstelle, dann muss es sich ja auch irgendwo im Speicher befinden, richtig?
Ist es möglich dieses Array mit anderen Programmen, oder mit einem anderen Autoit-Script auslesen? Man müsste ja eig. nur die Speicheradresse wissen,
oder ist das so einfach nicht?