„Object erforderlich: „DirName“

  • VBScript

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    „Object erforderlich: „DirName“

    Als erstes möchte ich ein freundliches Hallo an alle hier im Forum senden.

    Zuz mir
    Ich habe schon des mehrfachen versucht mich in VBS einzuarbeiten habe es dann aber immer wieder aufgegeben, da ich das Verständnis nicht aufbringen konnte. Vieles blieb einfach immer unklar für mich. Auch hatte ich keinen an meiner Seite der mir mal helfend und mit Rat beistand.:(

    Trotzdem habe ich nun schon das ein oder andere kleiner VBS erstellt. Stoße aber immer recht schnell an meine Grenzen. Auf der Suche nach Hilfe sin ich sehr oft in diesen Forum gelangt weshalb ich mich hier heute registriert habe.

    Die Suchfunktion habe ich natürlich genutzt aber nie das passende gefunden. Vielleicht verwende ich auch einfach nicht die richtigen Suchbegriffe...

    Ich bitte euch schon vorab um Nachsicht mit mir und hoffe eure Nerven und eure Geduld nicht zu sehr zu strapazieren. :) :saint:

    Nun zu meinem Problem:
    Die Fehlermeldung sagt „Object erforderlich: „DirName“ Dies bezieht sich auf die If Abfrage! Aber ich verstehe nicht was er will bzw. warum er diesen Fehler ausgibt, da das „for each“ ja läuft. Hier ein Ausschnitt meines VBS

    Visual Basic-Quellcode

    1. sFileSn1 = Right(sFileName,Len(sFileName)-InStrRev(sFileName,"\")) 'Dateiname ohne Pfadangabe
    2. sPath = Left(sFileName,InStrRev(sFileName, "\")-1) 'Speicherort, Pfadangabe ohne Datei
    3. sPackName = Left(sFileSN1,Len(sFileSN1)-4) 'Name der Datei ohne Dateiendung
    4. PathArray = Split(sPath, "\") 'Auslesen und aufteilen des Pfades
    5. For Each DirName In PathArray 'Durchlaufen der einzelnen Ordnernamen
    6. MsgBox DirName
    7. If DirName.contains ("Logs") Then
    8. WriteTXT( DocString )
    9. Else
    10. sDocFolder = sProjFolder & "Log" 'Pfad zum log ordner
    11. CreateFolderRecursive(sDocFolder) 'Ruft die Funktion auf und prüft ob die Ordner existieren. Wenn nicht werden diese angelegt.
    12. End If
    13. Next


    Vielen lieben Dank

    cappy79
    Mit Split bekommst du keine Collection zurück, sondern ein Array.
    Deswegen kannst du da (zumindest in VBS) nicht mit For..Each durchlaufen.

    Visual Basic-Quellcode

    1. For i = LBound(PathArray) To UBound(PathArray)
    2. Dir=PathArray(i)
    3. Next


    Auch DirName.Contains wird in VBS nicht funktionieren.
    Das sind Sprachelement aus .Net
    Statt dessen musst du INSTR verwenden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    Danke für deine schnelle Antwort. Die ich nun auch schon versucht habe umzusetzen aber nun auf einen neuen Fehler bezüglich des INSTR läuft. Dazu muss ich mich bezüglich INSTR weiter belesen.
    Ich verstehe aber Grundsätzlich deine Aussage nicht. Ich will sie auf keinen Fall anzweifeln ich will sie nur verstehen, denn ich habe ein anderes Script mit dem ich auf Prozesse prüfe und diese dann gegebenenfalls beende. Und dort nutze ich auch die For each Anweisung.

    Visual Basic-Quellcode

    1. Dim strName, objNetwork, objProcess, objInstance
    2. strName = "notepad.exe"
    3. Set objNetwork = CreateObject( "WScript.Network" )
    4. Set objProcess = GetObject( "winmgmts:{impersonationLevel=impersonate}!//" &_
    5. objNetwork.ComputerName ).ExecQuery( _
    6. "SELECT * FROM Win32_Process WHERE Name='" & strName & "'" )
    7. For Each objInstance In objProcess
    8. objInstance.Terminate 0
    9. Next


    Auch wenn ich mein obiges Skript ausführe, zeigt mir die Msgbox die einzelnen Ordnernamen ja an. *kopfkratz*
    Somit scheint das for each ja zu funktionieren, nur die If Abfrage danach läuft gegen den Baum wegen dem "fehlenden" Object? *unverständnis*


    Danke

    Nachtrag
    hahaha. Nun hab ich es. So funktioniert es:

    Visual Basic-Quellcode

    1. sFileSn1 = Right(sFileName,Len(sFileName)-InStrRev(sFileName,"\")) 'Dateiname ohne Pfadangabe
    2. sPath = Left(sFileName,InStrRev(sFileName, "\")-1) 'Speicherort, Pfadangabe ohne Datei
    3. sPackName = Left(sFileSN1,Len(sFileSN1)-4) 'Name der Datei ohne Dateiendung
    4. PathArray = Split(sPath, "\") 'Auslesen und aufteilen des Pfades
    5. For i = LBound(PathArray) To UBound(PathArray)
    6. dir=PathArray(i)
    7. Next
    8. If (InStr(dir,"Logs")) Then
    9. WriteTXT( DocString )Elses
    10. DocFolder = sProjFolder & "Log" 'Pfad zum log ordner
    11. CreateFolderRecursive(sDocFolder) 'Ruft die Funktion auf und prüft ob die Ordner existieren. Wenn nicht werden diese angelegt.
    12. End If


    DANKE!!!
    Aber wenn du mir meine Frage mit dem for each beantworten könntest wäre das echt spitze :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „cappy79“ ()

    Zunächst:
    Dein "Next" steht zu früh.
    Auf die Art bearbeitest du immer nur den letzten Eintrag der Schleife.

    Zur Frage:
    Beim ersten Beispiel bekommst du durch den Funktionsaufruf ein iterierbares Objekt zurück.
    Beim zweiten Beispiel bekommst du ein Array zurück.

    Zumindest in VBScript ist ein Array nicht iterierbar, sondern nur indizierbar (füchterliche Wortschöpfungen)
    Deswegen musst du ein Element im Array immer durch seinen Index ansprechen, also ​For i = ... i ist der Index, mit dem du das Arrayelement ansprichst.
    Nur bei einem iterierbaren Objekt (z.B. Collection) kannst du mit For..Each durchloopen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das mit dem Next stimmt. Es hatte nur funktioniert, da der gesuchte Ordner der letzte in der Struktur war. Wenn das Next aber später kommt funktioniert meine Ganze Logik nicht mehr....
    Jetzt habe ich aber wieder ein totales Verständnis Problem! Denn ich kann doch gar nicht mit der IF Abfrage innerhalb des for arbeiten, da er ja in jedem Durchlauf also für jedes gefundene Verzeichnis die If Abfrage durchführt und dass (da der gesuchte Ordner ja nicht gefunden wurde) das else Statement abarbeitet.

    Jetzt müsste das Script erst einmal alle ausgelesen Werte "sammeln" damit ich diese dann mit der IF INSTR abfragen kann....

    Nachtrag:
    Nun sollte es aber die richtigen Werte ausgeben :)

    Visual Basic-Quellcode

    1. sFileSn1 = Right(sFileName,Len(sFileName)-InStrRev(sFileName,"\")) 'Dateiname ohne Pfadangabe
    2. sPath = Left(sFileName,InStrRev(sFileName, "\")-1) 'Speicherort, Pfadangabe ohne Datei
    3. sPackName = Left(sFileSN1,Len(sFileSN1)-4) 'Name der Datei ohne Dateiendung
    4. PathArray = Split(sPath, "\") 'Auslesen und aufteilen des Pfades
    5. For i = LBound(PathArray) To UBound(PathArray)
    6. dir=PathArray(i)
    7. If (InStr(dir, "Logs")) Then
    8. Found = 1
    9. Exit For
    10. End If
    11. Next
    12. If Found = "1" Then
    13. WriteTXT( DocString )
    14. Found = "0"
    15. Else
    16. sDocFolder = sProjFolder & "Log" 'Pfad zum log ordner
    17. CreateFolderRecursive(sDocFolder) 'Ruft die Funktion auf und prüft ob die Ordner existieren. Wenn nicht werden diese angelegt.
    18. End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „cappy79“ ()

    cappy79 schrieb:

    If (InStr(dir, "Logs")) Then
    Instr gibt ein Integer zurück (0 bei nicht gefunden, die Position bei gefunden). If erwartet ab er eigentlich ein Boolean zum Vergleich.

    cappy79 schrieb:

    Found = 1
    Hier weist du Found die Zahl 1 zu

    cappy79 schrieb:

    If Found = "1" Then
    Hier fragst du ab ob in Found der String "1" drin steht.
    Du prüfst quasi
    If 1 = "1"
    .
    Du vergleichst hier Äpfel mit Birnen.
    Das Schlimme ist, dass das sogar noch TRUE ergibt, weil VBScript nur den Datentyp Variant kennt und bei impliziter Typkonvertierung eine eigene Pseudo-Intelligenz einsetzt (Äpfel und Birnen werden gleichgesetzt).
    Aber diese Art von Programmierung ist dermassen unsauber, dass sie dir in jeder anderen Programmierumgebung gnadenlos um die Ohren fliegt (glücklicherweise).

    Gewöhn dir besser einen sauberen Programmierstil an.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --