Array variable has incorrect number of subscripts or subscript dimension range exceeded

  • Hallo Forum,

    das unten angezeigte Script beendet mit Fehler in Zeile 41:

    ERRORArray variable has incorrect number of subscripts or subscript dimension range exceeded

    $AdUser=$AdUser[1] & "*," & $AdUser[2] & "*"
    $AdUser=$AdUser[1] & "*," & ^ in

    Was macht das Script?

    Liest Datei $file1 ein, in der Userangaben in der Form "Nachname, Vorname" enthalten sind und schreibt diese Angaben
    nach Änderung von Umlauten und einem AD-Query in Datei $file3, in der Form "SamAccount;Vorname,Nachname;Department".

    Ich habe nun schon viele Beiträge zum Thema "Ubound" gelesen, aber ich habe es noch nicht geschafft, es funktional einzusetzen.

    Ein Tipp in die richtige Richtung wäre klasse!


    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.2.10.0
    Author: Duckbone
    Version: 1.0.0
    Date: 10.03.2008
    Scriptname: ADsearch.au3

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Liest Datei $file1 ein, in der Userangaben in der Form "Nachname, Vorname" enthalten sind und schreibt diese Angaben
    nach Änderung von Umlauten und einem AD-Query in Datei $file3, in der Form "SamAccount;Vorname,Nachname,Department".

    [/autoit] [autoit][/autoit] [autoit]

    Abhängigkeiten: Benötigt adfind.exe
    #ce ----------------------------------------------------------------------------
    ;includes
    #include<String.au3>
    #include<Array.au3>
    #include <File.au3>
    ;Pfade
    $path="C:\_Automat\"
    $file1="UserNachnameVorname.txt"
    $file2="Aduser.txt"
    $file3="User.txt"
    ;Start Script
    $delfile = FileOpen($path & $file1, 0)
    If $delfile = -1 Then
    MsgBox(0, "Error", "Unable to open file: "& $path & $file1)
    Exit
    EndIf
    ;Umlaute ersetzen
    _ReplaceStringInFile($path & $file1,"ä","ae")
    _ReplaceStringInFile($path & $file1,"Ä","Ae")
    _ReplaceStringInFile($path & $file1,"ö","oe")
    _ReplaceStringInFile($path & $file1,"Ö","Oe")
    _ReplaceStringInFile($path & $file1,"ü","ue")
    _ReplaceStringInFile($path & $file1,"Ü","Ue")
    _ReplaceStringInFile($path & $file1,"ß","ss")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If @error = -1 Then ExitLoop
    ;Stringoperation
    $line = FileReadLine($delfile)
    $AdUser=StringSplit($line, ",")
    $AdUser=$AdUser[1] & "*," & $AdUser[2] & "*"
    If Not FileExists($path & "adfind.exe") Then
    MsgBox(0, "Error", "Unable to open file:" & $path & "adfind.exe" )
    Exit
    Else
    RunWait(@ComSpec & " /c " & "adfind -default dc=emea, dc=corpdir, dc=net, cn=*, cn=*, cn=users -f ""&(objectcategory=person)(name=" & $AdUser & ")"" cn sAMAccountName cn department > c:\_automat\AdUser.txt /q", "c:\_automat", @SW_HIDE)
    EndIf
    $AdUserFile = FileOpen($path & $file2, 0)
    If $AdUserFile = -1 Then
    MsgBox(0, "Error", "Unable to open file: "& $path & $file2)
    Exit
    EndIf
    ;Stringoperation
    $line3=FileReadLine($AdUserFile,3)
    $cn=_StringBetween($line3, ">cn: ", " (059")
    If Not $cn[0] = $line Then
    MsgBox(0,"Fehler", $cn[0] & " ist nicht identisch mit: " & $line )
    Exit
    Else
    $line4=FileReadLine($AdUserFile,4)
    $Department=StringSplit($line4, " ")
    $line5=FileReadLine($AdUserFile,5)
    $sam=StringSplit($line5, " ")
    FileWriteLine($path & $file3,$sam[2] & ";" & $cn[0] & ";" & $Department[2])
    $line = FileReadLine($delfile)
    $AdUser=StringSplit($line, ",")
    EndIf
    WEnd
    MsgBox(0,"Meldung", "Job Done!")
    Exit

    [/autoit]


    Grüße,

    Duckbone

    2 Mal editiert, zuletzt von Duckbone (21. März 2008 um 09:15)

  • ich kenn jetzt zwar die datei net aber ich rate mal :D

    Du hast bei FileReadLine(DATEI, LINE) die line vergessen also welche Zeile er auslesen soll, wenn du die ganze datei haben willst benutze nur FileRead,
    Da $line = "" ist gibt es auch nix zu splitten d.h. $ADuser = 0 ;) deswegen gibts da dann auch kein array

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Hi FireFlyer,

    die Datei hat den Inhalt

    Mustermann, Max

    Musterfrau, Erika

    etc.

    Durch die Schleife "While", "Wend" liest $line = FileReadLine($delfile) immer schön eine zeile nach der nächsten aus.

    Mit $AdUser=StringSplit($line, ",") teile ich den String in Nachname und Vorname, da ich hier 2 Variablen ($AdUser[1] und $AdUser[2]) für die Active Directory Abfrage benötige. Dies lese ich aus dem Array $AdUser aus, was auch bestens funktioniert.

    Gruß,

    Duckbone

  • Hallo Duckbone!

    Problem ist ganz einfach:
    (hab hier mal ein kleines übersichtliches Muster gezimmert, in meiner f:\nix99\vornachname.txt steht folgendeds

    Horst, Schaub
    Manfred, Zettelmeyer

    und danach ist noch ein Zeilenumbruch, sprich die Datei wird zum dritten Mal mit einer "leeren" Zeile durchgeführt und das geht nicht, da der StringSplit dann aussteigt (es gibt eben keinen Teil 1 und Teil 2)

    Bau das mal nach und setzt die beiden Zeilen, die ich Dir mit ; !!!! gekennzeichnet habe vorne auf Kommentar mit nem Strichpunkt, dann siehst Du perfekt das Problem. (2 Zeilen laufen und dann kommt die Fehlermeldung)

    (übrigens in der Praxis gefährlich, wenn irgendein Experte nur einen Vor- oder nachnamen oder mehrere Kommas in die Namenssteuerdatei eingebaut haben sollte).

    Noch nen Tip, ich nehm immer einen anderen Variablennamen also z.B.
    Zeile_gel für gelesene Zeile
    Zeile_ges (für gesamte Zeile aus Vor- und Nachnamen)
    sicher irgendwo Geschackssache aber wenn ich das Teil in 2 jahren wieder editieren muß übersichtlicher.


    Gruss aus dem Spessart


    German


    $VorNachnamefile="F:\nix99\vornachname.txt"
    Dim $aRecords

    If Not _FileReadToArray($VorNachnamefile,$aRecords) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf
    For $x = 1 to $aRecords[0]

    $line = $aRecords[$x]
    msgbox(0,"gelesene Zeile ist", $line,2)
    $AdUser=StringSplit($line, ",")
    if $Aduser[0] = 2 then ; !!!!!!!!!!!
    $AdUser=$AdUser[1] & "*," & $AdUser[2] & "*"
    msgbox(0,"AdUser ist", $Aduser)
    EndIf ; !!!!!!!


    Next