Jump to content
Sign in to follow this  
blob

Mit Batch u. VBS - Finden und ersetzen

Recommended Posts

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!

Share this post


Link to post
...

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

Share this post


Link to post

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 ;-)

Share this post


Link to post
...

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

...

 

lass den Slash weg (also replace.vbs vorname.bat)

 

... ach und bei der Ausgabe natürlich z.B. Msgbox objArgs(0)

Share this post


Link to post

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

Share this post


Link to post

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

Share this post


Link to post

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?!

Share this post


Link to post

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

Share this post


Link to post

Das Replace ersetzt mir den Pfad zur Datei, aber ich will ja das IN der Datei das Suchen und Ersetzen stattfindet :)

Share this post


Link to post

Moin,

 

das war ja auch nur ein Beispiel ... wenn in strText der Inhalt deiner Datei steht, geht das exakt genauso.

 

Gruß, Nils

Share this post


Link to post

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)

Share this post


Link to post

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!

Share this post


Link to post

Moin,

 

du suchst InStr(). Und darüber hinaus suchst du eine Scripting-Einführung. Ich empfehle die Bücher von Tobias Weltner.

 

Gruß, Nils

der gerne hilft, aber ein Forum nicht für die richtige Methode hält, um Grundlagenwissen aufzubauen.

Share this post


Link to post

Bin ich schon am durcharbeiten, aber leider noch nicht soweit ;-( (Buch: Windows Scripting)

 

Aber danke für die Funktion!

Share this post


Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...