Jump to content

Mit Batch u. VBS - Finden und ersetzen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen!

 

Folgendes Prob:

 

Ich habe ganz viele Logon Scripts, die mit der Zeit gewachsen sind. Nun soll für mehrere Logon Skripts (...\netlogon\username.bat) ein Laufwerk ergänzt werden. Jetzt will ich das das jedes Loginscript durchgearbeitet wird und mit dem neuen net use befehl bestückt wird, sprich in meinem Fall ein altes net use in den batch Dateien ersetzt wird.

 

Es bietet sich natürlich jetzt an in die Logonskripts ein CALL laufwerk.bat einzufügen, aber das kommt erst noch, will einen Lerneffekt für Scripting haben ;-)

 

 

Also ich hab mir eine Liste als TXT generiert, welches die Namen der Logonscripts beherbergt:

 

liste.txt:

vorname1.bat

vorname2.bat

nachname23.bat

etc...

 

Jetzt hab ich ein Batch mit einer Schleife, dass die Liste Zeile für Zeile auslesen soll und dann den Namen der einzelnen Loginscripts (wie gesagt in einer Schleife) abarbeiten soll:

 

FOR /f %%f IN (liste.txt) DO ..... %%f

 

Hier ist mein Knackpunkt, ich habe eine VBS die nach Mustern sucht und dann diese durch meinen Wunsch ersetzt. Ich brauch jetzt eine Möglichkeit, von Batch in der Schleife die einzelnen Zeilen an das VBS Skript weiterzugeben, so ähnlich wie:

 

FOR /f %%f IN (liste.txt) DO CALL c:\domain\netlogon\replace.vbs /%%f

 

 

Nur muss ich in der VBS jetzt irgendwas angeben, damit er von der Batch das %%f übernimmt. Jemand eine Idee?

 

Hier meine VBS:

 

strFilename = "HIER MUESSTE DIE VARIABLE VON DER BATCH REIN, z.B. vorname1.bat"

 

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.GetFile(strFilename)

intFileSize = objFile.Size

Set objFile = objFile.OpenAsTextStream()

strFileContent = objFile.Read(intFileSize)

objFile.Close

 

Set objRegExp = New RegExp

objRegExp.Pattern = Chr(34)

objRegExp.Global = True

objRegExp.IgnoreCase = True

strFileContent = objRegExp.Replace(strFileContent, "")

objRegExp.Pattern = "DAS_WAS_ICH_ERSETZEN_WILL"

strFileContent = objRegExp.Replace(strFileContent, "DAS_MIT_DEM_ICH_ES_ERSETZE")

Set objFile = objFSO.OpenTextFile(strFilename, 2)

objFile.Write strFileContent

objFile.Close

 

 

 

Merci im voraus!

Link zu diesem Kommentar
...

Es bietet sich natürlich jetzt an in die Logonskripts ein CALL laufwerk.bat einzufügen, aber das kommt erst noch, will einen Lerneffekt für Scripting haben ;-)

...

 

es würde sich vielleicht auch anbieten, sich das ganze Konzept zu überdenken ;) Ob man nicht mit wenigen Loginscripts, die mit entsprechenden Abfragen (z.B. mit "ifmember" o.ä.) arbeiten, das komfortabler händeln könnte.

 

Grüße, Frank

Link zu diesem Kommentar

Sorry, ich bin noch nicht so tief drin, ich habe es ein wenig ausprobiert....

 

Also wenn ich z.B. von Commandozeile was übergeben möchte an eine VBS Datei, ist dann folgender Syntax richtig: replace.vbs /vorname.bat

 

In der replace.bat baue ich dann einfach das Objekt ein:

 

Set objArgs = WScript.Arguments

 

 

???

 

Ich möchte das Ergebnis ja gerne kontrollieren, und versuche mir in einer MsgBox die Variable anzeigen zu lassen:

 

MsgBox objArgs

 

Kommt aber dann ein Laufzeitfehler. :-(

Richtig Frank, das ist natürlich 100% der bessere weg, mir geht es jetzt wirklich dabei nur um etwas mehr von Scripting zu verstehen.

 

Seh es dann einfach so, dass ich gerne wissen möchte wie ich Ergebnisse von Batch nach VBS bringe und umgekehrt ;-)

Link zu diesem Kommentar

Danke, diese (0) hat gefehlt! ;-)

 

 

Jetzt sieht es so aus, das Script:

 

set objArgs = WScript.Arguments

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.GetFile(objArgs(0))

intFileSize = objFile.Size

Set objFile = objFile.OpenAsTextStream()

strFileContent = objFile.Read(intFileSize)

objFile.Close

 

Set objRegExp = New RegExp

objRegExp.Pattern = Chr(34)

objRegExp.Global = True

objRegExp.IgnoreCase = True 'False für case-sensitive

strFileContent = objRegExp.Replace(strFileContent, "")

objRegExp.Pattern = "ERSETZE_MICH"

strFileContent = objRegExp.Replace(strFileContent, "ERSETZE_IHN_DURCH_MICH")

Set objFile = objFSO.OpenTextFile(objArgs(0), 2)

objFile.Write strFileContent

objFile.Close

 

 

Es funktioniert auch. Aber eine Frage hab ich noch ;-)

 

Der letzte Teil, und zwar:

Set objRegExp = New RegExp

objRegExp.Pattern = Chr(34)

objRegExp.Global = True

objRegExp.IgnoreCase = True 'False für case-sensitive

strFileContent = objRegExp.Replace(strFileContent, "")

objRegExp.Pattern = "ERSETZE_MICH"

strFileContent = objRegExp.Replace(strFileContent, "ERSETZE_IHN_DURCH_MICH")

Set objFile = objFSO.OpenTextFile(objArgs(0), 2)

objFile.Write strFileContent

objFile.Close

 

wie setze ich das z.B in einer Schleife ein? Hintergrund ist folgender: Es kann ja vorkommen das mehrere Wörter im Text ersetzt werden sollen, im ersten Durchlauf sucht er nach dem Wort HALLO und ersetzt es, und im zweiten Durchlauf durch die gleiche Datei sucht er nach SUPER und soll es ersetzen?! :o)

 

Brauch auch keine Schleife sein, einfach den letzten Block kopieren und nochmal drunter setzen... aber die Variabeln müssen dann ja angepasst werden, ich sehe leider nicht welche, daher würde es mir helfen wenn mir das jmd erörtern könnte?!

 

Sorry nochmal, ich bin manchmal etwas übereifrig. Ich bin mit dem Weltner Buch für VBScripting erst auf Seite 41 :-D

Link zu diesem Kommentar

Moin,

 

in deinem Beispiel gibt es überhaupt keinen Grund für Regular Expressions. Warum liest du nicht einfach den Dateiinhalt in eine Variable ein und bearbeitest die mit einfachen Replace-Kommandos?

 

strText = Replace(strDatei, "alterWert1", "neuerWert1", 1, -1, 1)

strText = Replace(strDatei, "alterWert2", "neuerWert2", 1, -1, 1)

usw.

 

Gruß, Nils

Link zu diesem Kommentar

zu Replace finde ich in der WSH 5.6 Doku nichts, ausser bei JScript?! Bei replace meckert WSH nicht, aber er tut dann gar nichts. Wenn ich es mir sinngemäß ableite, sieht es momentan mit replace bei mir so aus:

 

set objArgs = WScript.Arguments

 

strText = Replace(objArgs(0), "Hallo", "XXXXXX", 1, -1, 1)

 

 

muss ich mit der gefüllten Variable strText noch was machen? Wenn ich es mir als ausgeben lasse über msgbox, dann zeigt er mir den Inhalt von objArgs an, was ich mitgegeben habe, also den Pfad der Datei?!

Link zu diesem Kommentar

Moin,

 

also, dies hier funktioniert wie gewünscht. Durch die letzte "1" gibt es trotz der unterschiedlichen Groß-/Kleinschreibung einen Treffer, mit "0" würde es nicht ersetzen:

 

strText = "C:\Ordner\UnterOrdner\EineDateiMitNamen.txt"
strNeuerText = Replace(strText, "unterordner", "ErsetzterOrdner", 1, - 1, 1)
WScript.Echo strNeuerText

 

In der WSH-Doku steht das natürlich drin.

 

Gruß, Nils

Link zu diesem Kommentar

noch'n Beispiel:

Set MyFiles = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1, ForWriting = 2

varDatei="C:\Test.txt"
Set f = MyFiles.OpenTextFile(varDatei, ForReading)
Text = f.ReadAll

varSearch="zu_suchender_String"
varReplace="neuer_String"

Set f = MyFiles.OpenTextFile(varDatei, ForWriting, True)
f.Write Replace(Text, varSearch, varReplace,1,-1,1)

Link zu diesem Kommentar

Danke Danke Danke, es funktioniert, und schwups hab ich einen Fall wo mir das Skript ganz gut helfen kann, aber ich eine Frage dazu habe:

 

set objArgs = WScript.Arguments

Set MyFiles = CreateObject("Scripting.FileSystemObject")

Const ForReading = 1, ForWriting = 2

 

varDatei="objArgs(0)"

Set f = MyFiles.OpenTextFile(varDatei, ForReading)

TEXT = f.ReadAll

 

If TEXT = "TEXTPASSAGE_DIE_ICH_SUCHE" Then

.

.

.

end if

 

WScript.Quit

 

 

in der Variable TEXT steht ja nun der Inhalt der gewünschten Textdatei. Ich will mein Script nur ausführen, wenn das Suchwort bzw die Zeichenfolge in meiner IF Bedinngung übereinstimmt mit einer Passage aus dem Text. Nur hat er in der Variablen jetzt z.B. drin stehen: "Mein kleiner Hund geht nicht gerne Gassi", und ich vergleiche es mit dem Argument "Gassi" => Es würde jetzt matchen, aber er vergleicht dann den kompletten Inhalt, das Gassi alleine reicht ihm also nicht das es gleich ist.

Jemand einen Lösungsansatz bzw Idee?

 

Danke im voraus!

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...