In Bat text einfügen zur Ausgabe in eine andere Datei
Guten Morgen, es geht darum den Inhalt einer Datei, vmware-cmd.pl, mit Variablen zu verändern und zu Speichern.
Warum das Ganze? Ich versuche eine Batch zu schreiben die die Scripts anlegt die für das Automatische Backup von virtuellen Maschinen unter ESXI nötig sind.
Dafür muss mann die vmware-cmd.pl im Installationsverzeichnis verändern. Ein teil zur Prüfung des Passwortes muss auskommentiert werden und das Root Passwort für den ESXI Server muss eingetragen werden.
Nun könnte man mit echo text >> vmware-cmd.pl arbeiten, ist aber ein bisschen umständlich weil es sich um gut 100 Zeilen handelt...
Die Datei ist bei jeder Installation gleich.
Hat jemand eine Idee???
Warum das Ganze? Ich versuche eine Batch zu schreiben die die Scripts anlegt die für das Automatische Backup von virtuellen Maschinen unter ESXI nötig sind.
Dafür muss mann die vmware-cmd.pl im Installationsverzeichnis verändern. Ein teil zur Prüfung des Passwortes muss auskommentiert werden und das Root Passwort für den ESXI Server muss eingetragen werden.
Nun könnte man mit echo text >> vmware-cmd.pl arbeiten, ist aber ein bisschen umständlich weil es sich um gut 100 Zeilen handelt...
Die Datei ist bei jeder Installation gleich.
Hat jemand eine Idee???
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 142887
Url: https://administrator.de/forum/in-bat-text-einfuegen-zur-ausgabe-in-eine-andere-datei-142887.html
Ausgedruckt am: 22.12.2024 um 21:12 Uhr
12 Kommentare
Neuester Kommentar
Hallo gizmoFR,
... um die scripts per batch verändern zu können, müßtest Du quasi Elemente eines Batch-'Textprozessings' schreiben.
Sicher ist das möglich (s.u.) - jedoch übersteigt der Aufwand wahrscheinlich den des händischen Änderns des Scripts (zumal es ja auf allen Installationen gleich ist).
Gruß, Marwed
Beispiel: Hier nur ein Splitterchen ... um den Gesamtaufwand zu verdeutlichen
Batch: BESTIMMTE Zeilen aus Datei extrahieren
Liest jede Zeile der Datei VOLLSTÄNDIG (mit "tokens=*" also alle Token) ein und durchsucht sie nacheinander nach <key>Name</key> und weiteren Keys.
Die Übergabe der eingelesenen Zeile an die weiteren, inneren Schleifen erfolgt mit der Laufvariable %%i.
Normalerweise reicht hier die Formulierung 'echo %%i ^| findstr "Paul"' (Anm.: String in Anf.-Zeichen, ges. Befehl in FOR-Klammern in Hochkommas.)
Das heißt, daß %%i nicht in Anführungsstriche gesetzt werden muß.
In diesem Fall stammt die Zeile jedoch aus einem XML-Script und enthält viele Sonderzeichen.
<key>Name</key><string>Poison (Live At Tourhout Festival)</string>
Daher muß die Laufvariable bei der Übergabe an die inneren Schleifen in Anführungsstriche eingeschlossen werden, also als echo "%%i" geschrieben werden.
for /F "tokens=*" %%i in ( 'type %SFILE%' ) do (
for /F "tokens=*" %%j in ( 'echo "%%i" ^| findstr "<key>Name</key>"' ) do (
echo.
set LINE=%%j
set NAME= !LINE:~24,-11%!
)
for .... (suche nach Key 2) .... do (
....
....
)
und so weiter.
)
... um die scripts per batch verändern zu können, müßtest Du quasi Elemente eines Batch-'Textprozessings' schreiben.
Sicher ist das möglich (s.u.) - jedoch übersteigt der Aufwand wahrscheinlich den des händischen Änderns des Scripts (zumal es ja auf allen Installationen gleich ist).
Gruß, Marwed
Beispiel: Hier nur ein Splitterchen ... um den Gesamtaufwand zu verdeutlichen
Batch: BESTIMMTE Zeilen aus Datei extrahieren
Liest jede Zeile der Datei VOLLSTÄNDIG (mit "tokens=*" also alle Token) ein und durchsucht sie nacheinander nach <key>Name</key> und weiteren Keys.
Die Übergabe der eingelesenen Zeile an die weiteren, inneren Schleifen erfolgt mit der Laufvariable %%i.
Normalerweise reicht hier die Formulierung 'echo %%i ^| findstr "Paul"' (Anm.: String in Anf.-Zeichen, ges. Befehl in FOR-Klammern in Hochkommas.)
Das heißt, daß %%i nicht in Anführungsstriche gesetzt werden muß.
In diesem Fall stammt die Zeile jedoch aus einem XML-Script und enthält viele Sonderzeichen.
<key>Name</key><string>Poison (Live At Tourhout Festival)</string>
Daher muß die Laufvariable bei der Übergabe an die inneren Schleifen in Anführungsstriche eingeschlossen werden, also als echo "%%i" geschrieben werden.
for /F "tokens=*" %%i in ( 'type %SFILE%' ) do (
for /F "tokens=*" %%j in ( 'echo "%%i" ^| findstr "<key>Name</key>"' ) do (
echo.
set LINE=%%j
set NAME= !LINE:~24,-11%!
)
for .... (suche nach Key 2) .... do (
....
....
)
und so weiter.
)
Hallo gizmoFR!
"Suchen/Ersetzen" mit variablen Bestandteilen lässt sich natürlich, wie Marwed schon angemerkt hat, auch mit "Batch only" bewerkstelligen - im Zweifelsfall ist allerdings der Einsatz eines (auch temporär von einem Batch erzeugten) VBScripts vorzuziehen (im Forum findest Du diverse Beispiele dazu) ...
Könntest Du noch anhand eines "Vorher-Nachher"-Vergleiches der betreffenden Textstellen (zwischen "<code>"- und "</code>"-Tags) die nötigen Veränderungen etwas konkreter darstellen?
Grüße
bastla
"Suchen/Ersetzen" mit variablen Bestandteilen lässt sich natürlich, wie Marwed schon angemerkt hat, auch mit "Batch only" bewerkstelligen - im Zweifelsfall ist allerdings der Einsatz eines (auch temporär von einem Batch erzeugten) VBScripts vorzuziehen (im Forum findest Du diverse Beispiele dazu) ...
Könntest Du noch anhand eines "Vorher-Nachher"-Vergleiches der betreffenden Textstellen (zwischen "<code>"- und "</code>"-Tags) die nötigen Veränderungen etwas konkreter darstellen?
Grüße
bastla
Hallo gizmoFR!
Das Zerlegen des Textes in die Blöcke "vor der relevanten Zeile" (Block1.txt) und "nach der relevanten Zeile" (Block2.txt) wäre tatsächlich eine Strategie, die sich auch per Batch einfach umsetzen lässt:
Beim Schreiben der Passwort-Zeile ist darauf zu achten, dass die Zeichen "<|>&" in Batch besondere Bedeutung haben und daher durch ein vorangestelltes "^" zu "maskieren" sind. Außerdem habe ich vorausgesetzt, dass das Passwort in der Variablen %ROOTPASSWORT% steht - alternativ dazu könntest Du auch zB %1 schreiben und das Passwort beim Aufruf des Batches als Parameter übergeben.
Grüße
bastla
Das Zerlegen des Textes in die Blöcke "vor der relevanten Zeile" (Block1.txt) und "nach der relevanten Zeile" (Block2.txt) wäre tatsächlich eine Strategie, die sich auch per Batch einfach umsetzen lässt:
@echo off & setlocal
set "Datei=D:\Pfad\vmware-cmd.pl"
> "%Datei%" type D:\Block1.txt
>> "%Datei%" echo Vim::login(service_url =^> $url, user_name =^> $username, password =^> "%ROOTPASSWORT%");
>> "%Datei%" type D:\Block2.txt
Grüße
bastla
[OT]
Jezz' bin ich aber total gespannt, wie bastla sich aus einer dreiteiligen ODER-Frage rausdreht....
Ich wäre an Wochentagen wie diesem hoffnungslos überfordert...
Grüße
Biber
[/ OT]
Zitat von @gizmoFR:
Und kann man den Zerlegten Text in der BAT mit übergeben oder muss mann diese in einer getrennten Datei mitführen?
Oder ist es möglich die Datei "vmware-cmd.pl" aus der Bat zu Zerlegen?
Und kann man den Zerlegten Text in der BAT mit übergeben oder muss mann diese in einer getrennten Datei mitführen?
Oder ist es möglich die Datei "vmware-cmd.pl" aus der Bat zu Zerlegen?
Jezz' bin ich aber total gespannt, wie bastla sich aus einer dreiteiligen ODER-Frage rausdreht....
Ich wäre an Wochentagen wie diesem hoffnungslos überfordert...
Grüße
Biber
[/ OT]
Hallo gizmoFr,
Bitte formatiere deinen Code zur besseren Les-/Referenzier-barkeit unbedingt mit den dafür vorgesehenen aus der Formatierungshilfe
Ich kann nur bewundern das bastla dem irgendeinen Sinn abgewinnen konnte
Grundsätzlich erfordert das Erstellen eines Scripts einer anderen Sprache aus einem Batch/Script heraus das Verständnis der besonderen Anforderungen "beider" Sprachen. Dein Ansinnen ein Perlscript aus einer Batch zu generieren kompliziert also die ganze Angelegenheit.
Es wäre mMn viel sinnvoller das Perlscript mit einer zusätzlichen Option zu versehen die das Umschreiben überflüssig macht.
Leider "spreche" ich noch nicht ausreichend Perl um das zu tun, außerdem ist das Script etwas äähh - unglücklich formatiert.
Da steht aber was Copyright drin, hast du mal darüber nachgedacht bevor du das postest?
Gruß
LotPings
Bitte formatiere deinen Code zur besseren Les-/Referenzier-barkeit unbedingt mit den dafür vorgesehenen aus der Formatierungshilfe
Ich kann nur bewundern das bastla dem irgendeinen Sinn abgewinnen konnte
Grundsätzlich erfordert das Erstellen eines Scripts einer anderen Sprache aus einem Batch/Script heraus das Verständnis der besonderen Anforderungen "beider" Sprachen. Dein Ansinnen ein Perlscript aus einer Batch zu generieren kompliziert also die ganze Angelegenheit.
Es wäre mMn viel sinnvoller das Perlscript mit einer zusätzlichen Option zu versehen die das Umschreiben überflüssig macht.
Leider "spreche" ich noch nicht ausreichend Perl um das zu tun, außerdem ist das Script etwas äähh - unglücklich formatiert.
Da steht aber was Copyright drin, hast du mal darüber nachgedacht bevor du das postest?
Gruß
LotPings
Hallo gizmoFR!
@Biber
Na gut, doch etwas mehr Text: Nicht zuletzt wegen der enthaltenen Sonderzeichen würde ich gerne darauf verzichten, (unabhängig davon ob das Ausgangsscript, ob als eigene Datei vorliegt oder in den Batch integriert wird) per Batch die Nummer der zu ersetzenden Zeile ausfindig zu machen, alle davor liegenden Zeilen einzeln einzulesen und wieder (in die neue Datei) auszugeben, die neue Passwort-Zeile zu schreiben und dann die restlichen Zeilen (für die ist das möglich) am Stück an die neue Datei anzufügen - daher: Wenn die "Block1.txt" und "Block2.txt" genannten Teile "konstant genug" sind, würde ich sie einmalig per Editor erzeugen und leicht erreichbar (im Netz) ablegen; ansonsten wäre ich dann eher wieder bei VBS ...
... wo sich das Ganze auf ein reines "
Grüße
bastla
@Biber
Jezz' bin ich aber total gespannt, wie bastla sich aus einer dreiteiligen ODER-Frage rausdreht....
Ist doch ganz einfach - die Antwort ist (@gizmoFR): Ja Na gut, doch etwas mehr Text: Nicht zuletzt wegen der enthaltenen Sonderzeichen würde ich gerne darauf verzichten, (unabhängig davon ob das Ausgangsscript, ob als eigene Datei vorliegt oder in den Batch integriert wird) per Batch die Nummer der zu ersetzenden Zeile ausfindig zu machen, alle davor liegenden Zeilen einzeln einzulesen und wieder (in die neue Datei) auszugeben, die neue Passwort-Zeile zu schreiben und dann die restlichen Zeilen (für die ist das möglich) am Stück an die neue Datei anzufügen - daher: Wenn die "Block1.txt" und "Block2.txt" genannten Teile "konstant genug" sind, würde ich sie einmalig per Editor erzeugen und leicht erreichbar (im Netz) ablegen; ansonsten wäre ich dann eher wieder bei VBS ...
... wo sich das Ganze auf ein reines "
Replace
" des Passworts reduzieren ließe, etwa:Datei = "D:\Pfad\vmware-cmd.pl"
PW = "*Das neue Passw0rt*"
Set fso = CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(Datei).ReadAll
fso.CreateTextFile(Datei).Write Replace(T, "ROOTPASSWORT", PW)
Grüße
bastla
Moin gizmoFR,
Sonst mach ich die Grenzen dicht...
Grüße aus dem Land der ordnungsliebenden Kleinkrämer
Biber
Zitat von @gizmoFR:
werde mich dann mal mit VBS beschäftigen, schaden kann das ja nichts
Und bis ich dann so weit bin werde ich zerlegen und dann Zippen
Aber zusätzlich zum Zerlegen und Zippen bitte auch die von LotPinx so erhoffte Code-Formatierung verwenden.werde mich dann mal mit VBS beschäftigen, schaden kann das ja nichts
Und bis ich dann so weit bin werde ich zerlegen und dann Zippen
Sonst mach ich die Grenzen dicht...
Grüße aus dem Land der ordnungsliebenden Kleinkrämer
Biber