milo86
Goto Top

Vergleichen eines längeren Strings mit einem Kürzeren

Hallo zusammen,

für mein Vorhaben benötige ich ein VBS, welches einen längeren String mit einem Kürzeren vergleicht.
Gegeben ist ein Active Directory und ein dazugehöriges Distributed File System.

Vom AD bekomm ich folgende Daten nach einer Abfrage in eine Textdatei:
user1
user2
user3
user5

Aus dem DFS bekomm ich folgende Daten:
\\sub.pfad\abteilung\user1
\\sub.pfad\abteilung\user2
\\sub.pfad\abteilung\user4
\\sub.pfad\abteilung\user5

Mein bisheriger Code:
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile1 = objFSO.OpenTextFile("ad.txt", 1)  
If objFSO.getfile("ad.txt").size > 0 Then  
strComp = lcase(objFile1.ReadAll)
End If
objFile1.Close

Set objFile2 = objFSO.OpenTextFile("share.txt", 1)  
Do Until objFile2.AtEndOfStream
    strComp2 = lcase(objFile2.ReadLine)
    If InStr(strComp,strComp2) = 0 Then
        strResult = strResult & strComp2 & vbCrLf
    End If
Loop
objFile2.Close

Oben stehenden Code hab ich 2 mal in einer vbs Datei.
Beim einen werden die Pfade mit den Usern abgeglichen.
Da erhalte ich wenn ein User kein Share hat den User als Ergebnis in einer txt Datei. (Wird für die weitere Verarbeitung verwendet.)
Beim umgedrehten Fall hab ich das Problem, dass die User mit den Pfaden verglichen werden.
Das geht ja so ohne weiteres leider nicht.
Ich bekomme als Ergebnis immer alle Übereinstimmungen ausgegeben.
Dabei brauche ich aber die Pfade, die keine User zugeordnet haben. (In dem Fall als Ergebnis \\sub.pfad\abteilung\user4)

Habt Ihr eine Idee, wie man das umsetzen kann?

Beste Grüße
Oliver

Content-Key: 110960

Url: https://administrator.de/contentid/110960

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: bastla
bastla 10.03.2009 um 10:17:34 Uhr
Goto Top
Hallo milo86 und willkommen im Forum!

Wenn Du für jeden "share"-String nur den Teil nach dem letzten "\" vergleichen willst, kannst Du diesen Teil zB so erhalten:
If InStr(strComp2, "\") > 0 Then strComp2 = Mid(strComp2, InStrRev(strComp2, "\") + 1)
Um einen gesicherten Vergleich mit den einzelnen Zeilen von strComp zu erhalten, würde ich an den Anfang und das Ende von strComp noch ein vbCrLf setzen (damit ist jede Zeile mit Usernamen von Zeilenschaltungen umgeben) und dann als Suchbegriff
vbCrLF & strComp2 & vbCrLf
verwenden - so kannst Du verhindern, dass ein User "huber" gefunden wird, obwohl es nur einen "mayerhuber" gibt.

Grüße
bastla
Mitglied: milo86
milo86 10.03.2009 um 11:17:27 Uhr
Goto Top
Hallo bastla,

vielen Dank für die Willkommensgrüße und für Deine schnelle Hilfe!
Ich hab\'s anhand Deiner Vorgabe wie folgt geschrieben:
If InStr(strComp2, "\") > 0 Then   
strComp2_cut = Mid(strComp2, InStrRev(strComp2, "\") + 1)  
    If InStr(strComp,strComp2_cut) = 0 Then
        strResult = strResult & strComp2 & vbCrLf
	End If
End If

Funktioniert auch wunderbar!
Kannst Du mir bitte etwas erklären, was Deine Zeile Code macht?

Es tat sich ein zweites Problem auf.
Ich lese die Shares aus dem DFS mittels Batch und "dir" aus.
Es gibt ein Share (mein eigenes) in welches ich reingucken darf.
Der Pfad sieht dann so aus: \\sub.pfad\abteilung\mein_user\\eigene dateien\\test

Kann ich meinen eigenen User ausschließen? Weil alle meine Unterordner werden natürlich auch als Ergenis ausgegeben, da der User nicht am Ende steht.

Ist es möglich auch von \\sub.pfad\abteilung\user1 die Abteilung auszulesen?

Grüße
Oliver
Mitglied: bastla
bastla 10.03.2009 um 13:38:33 Uhr
Goto Top
Hallo milo86!

Abteilung auslesen: Wenn es um den (unter Berücksichtigung des Trennzeichens "\") vierten Teil des Strings geht (die beiden "\" am Beginn des Pfades werden einzeln gezählt), dann etwa so:
strComp2 = Split(lcase(objFile2.ReadLine), "\")(3)
3 deshalb, weil Split() ein 0-basiertes Array erzeugt (erstes Element hat demnach Index 0).
Kurze Erklärung zum vorher geposteten Code:
InStrRev() sucht nach dem ersten Vorekommen von "\", beginnt allerdings am Ende des Strings (sucht also von rechts nach links). Die Zeichenposition der Fundstelle wird aber, wie von InStr() her gewohnt, von links gezählt.
Da der gefundene "\" nicht benötigt wird, Position um 1 erhöhen und mit Mid() ab dieser Position bis zum Ende (daher keine Angabe der Länge des gewünschten Teilstrings) den Rest des Strings als Ergebnis verwenden.

Grüße
bastla
Mitglied: milo86
milo86 10.03.2009 um 18:33:51 Uhr
Goto Top
Hallo bastla,

vielen Dank für Deine Ausführung. Das sollte erstmal ausreichen um ein Script zu schreiben, welches meinen Bedürfnissen genügt.
Wenn es fertig ist, schreib ich nochmal.

Vielen Dank und Grüße
Oliver