82312
Goto Top

String ersetzen mittels Replace

Hi Leute,

ich soll Textzeilen aus einer .txt Datei umwandeln und in eine .cmd Datei abspeichern.(VBScript)

Quelldatei: Quelle.txt
Inhalt: z.B. \\denetz2is21fps1\u$\users\mustermannm

muss umgewandelt werden in:

Zieldatei: Zieldatei.cmd
Inhalt: Rsync -vrPtz winreplicator@denetz2is21fps1::u-data/users/mustermannm /cygdrive/u/users

wobei das /u$/ variabel ist, also es kann auch /e$/ heißen...zudem ist der servername auch variabel....
Mein Ausbilder hatte mir gesagt ich soll das mit InString Len Pos machen damit komme ich aber garnicht klar...
RegExp kann ich leider auch nicht...
Ich wäre euch sehr verbunden, wenn ihr mir ein paar Tips geben könntet face-smile

Vielen Dank,
Max

Content-Key: 123823

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

Printed on: April 24, 2024 at 06:04 o'clock

Member: TsukiSan
TsukiSan Aug 31, 2009 at 07:45:32 (UTC)
Goto Top
Hallo baeks1986,

Mein Tipp:
1) Fachlektüre zulegen, bzw. durcharbeiten
2) gelerntes Wissen umsetzen -> dazu selber Beispiele ausprobieren und verstehen
3) Bei bestehenden und nicht funktionierenden Scripten wieder anfragen.

Deine Hausaufgaben werden wir nicht für dich abarbeiten!

Gruß
Tsuki
Member: bastla
bastla Aug 31, 2009 at 08:04:01 (UTC)
Goto Top
... und
1b) auch andere Quellen benutzen (mir war fast so, als hätte ich ähnliche Fragestellungen sogar schon in diesem Forum hier gesehen face-wink)
1c) es (zusätzlich zu den Vorgaben wie "InStr" etc) mit der Übersetzung des Begriffes "ersetzen" versuchen

und schließlich (später)
4) hinterfragen, ob es nötig/sinnvoll ist, per VBS einen Batch zu erstellen, wenn sich die Aufgabe ev auch ohne diesen Umweg unmittelbar in Batch realisieren ließe ...

Grüße
bastla
Mitglied: 82312
82312 Aug 31, 2009 at 08:06:40 (UTC)
Goto Top
Hallo TsukiSan,

was meinst du was ich hier grade mache? Ich habe nur garkeine Idee wie ich das mit Len oder Pos hinbekommen kann, außerdem habe ich nicht nach DER Lösung gefragt sondern nach ein paar Tipps, die ihr mir vllt geben könnt. Vllt hat ja auch jmd nen anderen Lösungsansatz....

Mein Tipp:
1) Den Post richtig durchlesen
2) Nicht so unfreundlich sein, wir haben alle Montag!

zu 1b) ich habe soetwas nicht gefunden,
zu 1c) die replace funktion bringt hier nichts, da die zu ersetzenden zeichen wörter usw. variabel sind...
und zu 4) ja es ist nötig eine batch zu erstellen, weil die zieldatei in einem cmd prog ausgeführt wird.

Danke für eure freundliche Unterstützung!
Mitglied: 82312
82312 Aug 31, 2009 at 08:16:09 (UTC)
Goto Top
Hier ist übrigens mein Lösungsansatz, nur leider mit der Replace funktion, welche natürlich nicht die variablen abdecken würde...nur damit ihr nicht meint ich würde hier sitzen und warten das mir jmd das script schreibt!

DIM strSearch, strChangeWith, strNewContent, strContent


'Variablen bestimmen  
strSearch = "\\"  
strChangeWith = "Rsync -vrPtz winreplicator@"  

'Datei auslesen   
Set oFSO = CreateObject("Scripting.FileSystemObject")   
Set File = oFSO.OpenTextFile("nettetal.txt", 1, True)   
strContent = File.ReadAll 
File.Close 

'String finden und ersetzen   
strNewContent = Replace(strContent, strSearch , strChangeWith)

'In Datei schreiben  
Set File = oFSO.OpenTextFile("nettetal_FINAL.txt", 2)   
File.Write strNewContent
File.Close

'_________________________________________________________________________________________  
'_________________________________________________________________________________________  


'Variablen bestimmen  
strSearch = "\u$\"  
strChangeWith = "::u-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)

'In Datei schreiben  
Set File = oFSO.OpenTextFile("nettetal_FINAL.txt", 2)   
File.Write strNewContent
File.Close

'_________________________________________________________________________________________  
'_________________________________________________________________________________________  


'Variablen bestimmen  
strSearch = "\"  
strChangeWith = "/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)

'In Datei schreiben  
Set File = oFSO.OpenTextFile("nettetal_FINAL.txt", 2)   
File.Write strNewContent
File.Close

'_________________________________________________________________________________________  
'_________________________________________________________________________________________  


'Variablen bestimmen  
strSearch = "zschenderleinh"  
strChangeWith = "zschenderleinh /cygdrive/u/users"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)

'In Datei schreiben  
Set File = oFSO.OpenTextFile("nettetal_FINAL.txt", 2)   
File.Write strNewContent
File.Close



[Edit Biber] Code-Tags nachgezogen [/Edit]
Member: Woolfsmann
Woolfsmann Aug 31, 2009 at 08:38:00 (UTC)
Goto Top
Hi,

da da so viel Variables drin ist, würde ich auf Regual Expressions ausweichen.

Ich kenn VB Scripte nciht und weiß nicht wie fähig die damit umgehen können aber mit nem Perl Script und nen bisschen RegEx ist das nicht so schwer.
Mit z.B. dem Toturial http://www.xlab.net/jochen/perl/perl-3.html oder jedem anderen über RegEx kommst du weiter.

gruß
Woolfsmann


Edit ... Ich konnts nicht lassen ;)


#/usr/bin/perl
use strict;
open (IN,"Quelle.txt");  
open (OUT,">Zieldatei.cmd");  

foreach (<IN>)
{
	if ($_ =~ /\\\\(.*)\\.*\\users\\(.*)/)
	{
		print OUT "Rsync -vrPtz winreplicator\@$1::u-data/users/$2 /cygdrive/ u/ /users\n";  
	}
}
Member: bastla
bastla Aug 31, 2009, updated at Oct 18, 2012 at 16:39:11 (UTC)
Goto Top
Hallo baeks1986!
zu 1b) ich habe soetwas nicht gefunden,
War offensichtlich auch gar nicht nötig - dieser Beitrag hätte ohnehin fast genau den gleichen Ansatz geboten, den Du schon hattest ...

... uns aber aus unerfindlichen Gründen nicht zeigen wolltest ...
Vorweg eine Anmerkung zu Deinem Schnipsel: Das Schreiben in die Datei ist natürlich nur einmal erforderlich - wenn alle Ersetzungen vorgenommen sind.
Wenn es variable Bestandteile in den Pfaden gibt, müssen diese ja an einem Kriterium zu erkennen sein (etwa am "$" oder der Position innerhalb des Pfades), ansonsten lässt sich der Vorgang ohnehin nicht automatisieren.

Es wird sich in diesem Fall anbieten, die Datei zeilenweise zu verarbeiten, die jeweilige Zeile (= den Pfad) per Split() in die einzelnen Bestandteile zu zerlegen und diese zu untersuchen, umzuwandeln und dann neu zu kombinieren.

Grüße
bastla

P.S.:
und zu 4) ja es ist nötig eine batch zu erstellen, weil die zieldatei in einem cmd prog ausgeführt wird.
Infrage gestellt habe ich ja nur die Notwendigkeit des VBScripts, nicht des Batches (der, wie oben für das Script dargestellt, die Ausgangsdatei ebenfalls zeilenweise auslesen, in ihre Bestandteile zerlegen und umformen sowie schließlich das "Rsync" auch gleich ausführen könnte) ...
Member: bastla
bastla Aug 31, 2009 at 08:43:06 (UTC)
Goto Top
@Woolfsmann

ACK, obwohl es mit der Variablität ja nicht so dramatisch sein dürfte (vermutlich nur Server- und Share-Anteil).

Grüße
bastla
Mitglied: 82312
82312 Aug 31, 2009 at 09:01:15 (UTC)
Goto Top
Vielen Dank für die Tipps, ich werde mich da nochmal dran setzen und werde euch mein Ergebniss dann posten.

Bis später....
Mitglied: 82312
82312 Aug 31, 2009 at 09:22:02 (UTC)
Goto Top
So sieht mein Ergebniss bis jetzt aus, klappt irgendwie auch wenn es nicht wirklich elegant ist face-sad

DIM strSearch, strChangeWith, strNewContent, strContent


'Variablen bestimmen  
strSearch = "\\"  
strChangeWith = "Rsync -vrPtz winreplicator@"  

'Datei auslesen   
Set oFSO = CreateObject("Scripting.FileSystemObject")   
Set File = oFSO.OpenTextFile("them.txt", 1, True)   
strContent = File.ReadAll 
File.Close 

'String finden und ersetzen   
strNewContent = Replace(strContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\u$\"  
strChangeWith = "::u-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\D$\"  
strChangeWith = "::D-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\E$\"  
strChangeWith = "::E-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\e$\"  
strChangeWith = "::e-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\d$\"  
strChangeWith = "::d-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  
'Variablen bestimmen  
strSearch = "\"  
strChangeWith = "/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)

'In Datei schreiben  
Set File = oFSO.OpenTextFile("them_FINAL.txt", 2)   
File.Write strNewContent
File.Close

'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

Jetzt habe ich noch ein Problem: und zwar muss "/cygdrive/u/users" das hier noch ans ende jeder zeile...aber wie bekomme ich das hin? vor allem, weil es nur ans ende jeder beschriebenen zeile muss...hab bei google nichts gefunden face-sad

Mfg
Member: bastla
bastla Aug 31, 2009 at 09:30:13 (UTC)
Goto Top
Hallo baeks1986!
Jetzt habe ich noch ein Problem
Offensichtlich auch noch ein zweites: Die vernünftige Formatierung (als "") Deines Scripts ...
[Edit] Problem 2 gelöst face-smile [/Edit]
Für das Verknüpfen von Text kannst Du & verwenden.

Woran ist eine "beschriebenen Zeile" zu erkennen?

Grüße
bastla
Mitglied: 82312
82312 Aug 31, 2009 at 09:38:41 (UTC)
Goto Top
Jetzt hab ichs geschafft ;)

eine beschriebene Zeile ist daran zu erkennen, das text drin steht...oder vllt kann ich einfach die Leerzeilen löschen? dann müsste es nurnoch ans ende jeder Zeile...

Kennt da einer ne nette lösung?
Member: bastla
bastla Aug 31, 2009 at 09:45:17 (UTC)
Goto Top
Hallo baeks1986!

Um festzustellen, ob eine Stringvariable keinen Inhalt hat´(also in diesem Fall eine Leerzeile repräsentiert), brauchst Du nur ein einfaches If (setzt allerdings zeilenweise Bearbeitung voraus):
If strVariable = "" Then ...
Grüße
bastla
Mitglied: 82312
82312 Aug 31, 2009 at 09:51:27 (UTC)
Goto Top
Womit dieses Problem gelöst wäre.
Nur wie bekomme ich ans ende jeder Zeile einen String? Ich bekommen den gewünschen String irgendwie immer nur in die letzte Zeile face-sad
Member: bastla
bastla Aug 31, 2009 at 10:00:28 (UTC)
Goto Top
Hallo baeks1986!

Na geht ja dahin ... face-smile

Wenn Du die Zerlegung in einzelne Zeilen geschafft hast, kannst Du ja auch diese einzelnen Zeilen samt Zusatz per WriteLine in die Zieldatei schreiben.
Zur oben noch gestellten Frage
oder vllt kann ich einfach die Leerzeilen löschen?
Das könntest Du zB so lösen:
Do While InStr(strContent, vbCrLF & vbCrLF) > 0
    strContent = Replace(strContent, vbCrLF & vbCrLF, vbCrLF)
Loop
Dann würde sich auch das Anfügen des Zusatzes wieder per Replace() anbieten:
strContent = Replace(strContent, vbCrLF, strZusatz & vbCrLF)
Grüße
bastla
Mitglied: 82312
82312 Aug 31, 2009 at 10:23:28 (UTC)
Goto Top
Vielen Dank bastla, hat soweit alles geklappt....

Vielen Vielen Vielen Dank für eure Hilfe....
Mitglied: 82312
82312 Aug 31, 2009 at 10:25:19 (UTC)
Goto Top
So habe ichs jetzt gemacht...bevor ich hier jetzt backpfeifen bekomme, bin absoluter neuling und das ist mein 1. script nach hello world :D

DIM strSearch, strChangeWith, strNewContent, strContent


'Variablen bestimmen  
strSearch = "\\"  
strChangeWith = "Rsync -vrPtz winreplicator@"  

'Datei auslesen   
Set oFSO = CreateObject("Scripting.FileSystemObject")   
Set File = oFSO.OpenTextFile("them.txt", 1, True)   
strContent = File.ReadAll 
File.Close 

'String finden und ersetzen   
strNewContent = Replace(strContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\u$\"  
strChangeWith = "::u-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\D$\"  
strChangeWith = "::D-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\E$\"  
strChangeWith = "::E-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\e$\"  
strChangeWith = "::e-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\d$\"  
strChangeWith = "::d-data/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)
'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Variablen bestimmen  
strSearch = "\"  
strChangeWith = "/"  

'String finden und ersetzen   
strNewContent = Replace(strNewContent, strSearch , strChangeWith)

'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'Leerzeilen löschen  
strNewContent = Replace(strNewContent, vbCrLF & vbCrLF, vbCrLF) 

'rest Anfügen  
strNewContent = Replace(strNewContent, vbCrLF, "/cygdrive/u/users" & vbCrLF)  

'_________________________________________________________________________________________  
'_________________________________________________________________________________________  

'In Datei schreiben  
Set File = oFSO.OpenTextFile("them_FINAL.txt", 2)   
File.Write strNewContent
File.Close

'_________________________________________________________________________________________  
'_________________________________________________________________________________________  
Member: bastla
bastla Aug 31, 2009 at 10:40:27 (UTC)
Goto Top
Hallo baeks1986!

Das Löschen der Leerzeilen funktioniert in Deiner "Sparvariante" (ohne Schleife) allerdings nur für einzelne, nicht aber für mehrere aufeinander folgende Leerzeilen ...
Noch eine Anmerkung zur Variablendeklaration mit "Dim": Wenn Du diese verwendest, dann aber konsequent für alle im Script vorkommenden Variablen und mit einem "Option Explicit" als erster Zeile, damit Du auf nicht deklarierte (das sind vor allem auch falsch geschriebene) Variablen hingewiesen wirst.

Grüße
bastla
Mitglied: 82312
82312 Aug 31, 2009 at 11:09:36 (UTC)
Goto Top
ah ok vielen dank...

dann hatte ich ja glück, dass in den quelldateien keine 2 leerzeilen hintereinander sind...ich werde es trotzdem mal wieder in deine variante ändern, damit jede warscheinlichkeit abgedecktist...

Ich habe doch jede variable in dem script deklariert, warum dann dieses option explict?
Oder habe ich da eine vergessen?

Vielen dank schonmal bastla, wie du ja merkst bin ich wirklich absoluter neuling und freue mich über jeden tipp den ich bekommen kann face-smile

Gruss,
baeks
Member: bastla
bastla Aug 31, 2009 at 11:27:09 (UTC)
Goto Top
Hallo baeks1986!

Sobald Du das "Option Explicit" eingefügt hast, wirst Du beim nächsten Scriptlauf bemerken, dass es auch noch nicht deklarierte Variablen gibt ...

Der (zusätzliche) Sinn der Variablenprüfung ist, dass falsch geschriebene Variablennamen (etwa ein "strNewContnet ") als "nicht deklariert" bemängelt werden und Du damit einen Hinweis auf diesen Fehler erhältst.

Grüße
bastla