gizmofr
Goto Top

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

Content-Key: 142887

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

Printed on: April 19, 2024 at 19:04 o'clock

Member: Marwed
Marwed May 16, 2010 at 10:51:11 (UTC)
Goto Top
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.
)
Member: bastla
bastla May 16, 2010 at 11:12:43 (UTC)
Goto Top
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
Member: gizmoFR
gizmoFR May 17, 2010 at 08:54:37 (UTC)
Goto Top
Guten Morgen und Danke für die Antworten.
Der Inhalt der Datei an sich bleibt gleich, außer das ich das Root Passwort eintragen muss...

Kann ich vielleicht durch echo eine bestimmte Zeile ersetzen?
Oder den text zerhacken und per more >> wieder zusammen führen?
Wenn nicht werde ich das mit dem VBS versuchen, obwohl ich mich auch da auf Neuland bewegeface-smile

Nochmal vielen Dank!!

Ich gebe mal einen Beispiel aus der Datei mit, zu ändern ist die letzte Zeile, im original folgen dann nochmal ca 100 Zeilen :

#!/usr/bin/perl -w
#
  1. Copyright 2006 VMware, Inc. All rights reserved.

use strict;
use warnings;

use VMware::VIRuntime;
use VMware::VILib;
use HTTP::Date;
sub register;
sub unregister;

my ($username, $password);
my $enc = "utf8";
my $target_host;
my $host;
my $port = "443";
my $protocol = "https";
my $target_flag = 0;
my $help_flag = 0;
my $quiet_flag = 0;
my $verbose_flag = 0;
my $list_flag = 0;
my $server_flag = 0;
my @cmdarray = parse_cmdline();
my $operation = "";

if(validate()) {
setencoding();
connectserver();
if(validatehost()) {
vmaction();
}
disconnectserver();
}

sub vmaction {
if ($verbose_flag == 1) {
my $service_content = Vim::get_service_content();
Util::trace(0, "API Version: " . $service_content->about->apiVersion . "\n");
}
if ($list_flag == 1) {
get_all_vms();
}
elsif ($server_flag == 1) {
$operation = $cmdarray;
my $vm_cfg_path = generate_cfg_path($cmdarray[1]);
if ($operation eq 'unregister') {
my $vm_view = get_vm($vm_cfg_path);
if (defined $vm_view) {
if(unregister($vm_view)) {
if($quiet_flag == 0) {
Util::trace(0,"unregister() = ");
}
Util::trace(0,"1");
}
}
}
elsif ($operation eq 'register') {
if(register($vm_cfg_path)) {
if($quiet_flag == 0) {
Util::trace(0,"register() =");
}
Util::trace(0,"1");
}
}
}
else {
$operation = $cmdarray[1];
my $vm_cfg_path = generate_cfg_path($cmdarray);
my $vm_view;
if (defined $vm_cfg_path) {
$vm_view = get_vm($vm_cfg_path);
}
if (defined $vm_view) {
if ($operation eq 'getstate') {
if($quiet_flag == 0) {
Util::trace(0,"getstate() = ");
}
Util::trace(0, getstate($vm_view));
}
my $type = $cmdarray[2];
if(controlvm($vm_view, $operation, $type)) {
if($quiet_flag == 0) {
Util::trace(0,"${operation}() = ");
}
Util::trace(0,"1");
}
}
elsif ($operation eq 'getproductinfo') {
if($quiet_flag == 0) {
Util::trace(0,"getproductinfo(${cmdarray[2]}) = ");
}
Util::trace(0, getproductinfo());
}
elsif ($operation eq 'getuptime') {
if($quiet_flag == 0) {
Util::trace(0,"getuptime() = ");
}
Util::trace(0,getuptime($vm_view));
}
elsif ($operation eq 'answer') {
answer($vm_view);
}
elsif ($operation eq 'getconfigfile') {
if($quiet_flag == 0) {
Util::trace(0,"getconfigfile() = ");
}
Util::trace(0,getconfigfile($vm_view, $vm_cfg_path));
}
elsif ($operation eq 'gettoolslastactive') {
if($quiet_flag == 0) {
Util::trace(0,"gettoolslastactive() = ");
}
Util::trace(0,gettoolslastactive($vm_view));
}
elsif ($operation eq 'setguestinfo') {
if(setguestinfo($vm_view)) {
if($quiet_flag == 0) {
Util::trace(0,"setguestinfo(${cmdarray[2]} ${cmdarray[3]}) = ");
}
Util::trace(0,"1");
}
}
elsif ($operation eq 'getguestinfo') {
my ($flag, $value) = getguestinfo($vm_view);
if($flag) {
if($quiet_flag == 0) {
Util::trace(0,"getguestinfo(${cmdarray[2]}) = ");
}
Util::trace(0,$value);
}
else {
Util::trace(0,"The specified property or variable"
. " is invalid or undefined");
}
}
elsif ($operation eq 'hassnapshot') {
my $flag = hassnapshot($vm_view);
if($flag) {
if($quiet_flag == 0) {
Util::trace(0,"hassnapshot () = 1");
}
else {
Util::trace(0,"1");
}
}
else {
if($quiet_flag == 0) {
Util::trace(0,"hassnapshot () =");
}
else {
Util::trace(0," ");
}
}
}
elsif ($operation eq 'createsnapshot') {
my $flag = createsnapshot($vm_view);
if($flag) {
if($quiet_flag == 0) {
Util::trace(0,"createsnapshot (${cmdarray[2]} ${cmdarray[3]} ".
"${cmdarray[4]} ${cmdarray[5]}) = 1");
}
else {
Util::trace(0,"1");
}
}
}
elsif ($operation eq 'revertsnapshot') {
                          1. defect 255376
                          my $hassnap = hassnapshot($vm_view);
                          if($hassnap) {
                          my $flag = revertsnapshot($vm_view);
                          if($flag) {
                          if($quiet_flag == 0) {
                          Util::trace(0,"revertsnapshot () = 1");
                          }
                          else {
                          Util::trace(0,"1");
                          }
                          }
                          }
                          }
                          elsif ($operation eq 'removesnapshots') {
                          my $flag = removesnapshots($vm_view);
                          if($flag) {
                          if($quiet_flag == 0) {
                          Util::trace(0,"removesnapshot () = 1");
                          }
                          else {
                          Util::trace(0,"1");
                          }
                          }
                          }
                          elsif ($operation eq 'connectdevice') {
                          if(connectdevice($vm_view, 1)) {
                          if($quiet_flag == 0) {
                          Util::trace(0,"connectdevice(${cmdarray[2]}) = ");
                          }
                          Util::trace(0,"1");
                          }
                          }
                          elsif ($operation eq 'disconnectdevice') {
                          if(connectdevice($vm_view, 0)) {
                          if($quiet_flag == 0) {
                          Util::trace(0,"disconnectdevice(${cmdarray[2]}) = ");
                          }
                          Util::trace(0,"1");
                          }
                          }
                          }
                          }
                          }


                          sub parse_cmdline {
                          my @cmdarray;
                          for (my $i=0; $i<=$#ARGV; $i++) {
                          if ($ARGV[$i] eq "-l") {
                          $list_flag = 1;
                          }
                          elsif ($ARGV[$i] eq "-s") {
                          $server_flag = 1;
                          }
                          elsif ($ARGV[$i] eq "-H") {
                          $host = $ARGV[$i+1];
                          $i++;
                          }
                          elsif ($ARGV[$i] eq "-T") {
                          $target_flag = 1;
                          $target_host = $ARGV[$i+1];
                          $i++;
                          }
                          elsif ($ARGV[$i] eq "-U") {
                          $username = $ARGV[$i+1];
                          $i++;
                          }
                          elsif ($ARGV[$i] eq "-P") {
                          $password = $ARGV[$i+1];
                          $i++;
                          }
                          elsif ($ARGV[$i] eq "-Q") {
                          $protocol = $ARGV[$i+1];
                          $i++;
                          }
                          elsif ($ARGV[$i] eq "-O") {
                          $port = $ARGV[$i+1];
                          $i++;
                          }
                          elsif ($ARGV[$i] eq "-h") {
                          $help_flag = 1;
                          }
                          elsif ($ARGV[$i] eq "-q") {
                          $quiet_flag = 1;
                          }
                          elsif ($ARGV[$i] eq "-v") {
                          $verbose_flag = 1;
                          }
                          elsif($ARGV[$i] eq "--server") {
                          $host = $ARGV[$i+1];
                          $i++;
                          }
                          elsif($ARGV[$i] eq "--username") {
                          $username = $ARGV[$i+1];
                          $i++;
                          }
                          elsif($ARGV[$i] eq "--password") {
                          $password = $ARGV[$i+1];
                          $i++;
                          }
                          elsif($ARGV[$i] eq "--encoding") {
                          $enc = $ARGV[$i+1];
                          $i++;
                          }
                          else {
                          @cmdarray = (@cmdarray,$ARGV[$i]);
                          }
                          }
                          return @cmdarray;
                          }

                          sub setencoding {
                          if ($enc eq "utf8") {
                          $enc = Opts::getencname();
                          }

                          if (defined($enc)) {
                          binmode(STDIN, ":encoding($enc)");
                          binmode(STDOUT, ":encoding($enc)");
                          binmode(STDERR, ":encoding($enc)");
                          }
                          }

                          sub connectserver {
                          my $url = $protocol."://" . $host . ":$port". "/sdk";
                          eval {
                          Vim::login(service_url => $url, user_name => $username, password => "ROOTPASSWORT");
Member: bastla
bastla May 17, 2010 at 09:41:51 (UTC)
Goto Top
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:
@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  
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
Member: gizmoFR
gizmoFR May 17, 2010 at 10:07:56 (UTC)
Goto Top
Mahlzeit!!
Danke für die schnelle Antwort Bastla!
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?

MfG
Member: Biber
Biber May 17, 2010 at 10:32:58 (UTC)
Goto Top
[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?

Jezz' bin ich aber total gespannt, wie bastla sich aus einer dreiteiligen ODER-Frage rausdreht....
Ich wäre an Wochentagen wie diesem hoffnungslos überfordert... face-wink

Grüße
Biber
[/ OT]
Mitglied: 77559
77559 May 17, 2010 at 11:50:00 (UTC)
Goto Top
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 face-wink

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
Member: bastla
bastla May 17, 2010 at 12:19:27 (UTC)
Goto Top
Hallo gizmoFR!

@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 face-wink

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
Member: bastla
bastla May 17, 2010 at 12:20:36 (UTC)
Goto Top
Hallo LotPings!
Ich kann nur bewundern das bastla dem irgendeinen Sinn abgewinnen konnte face-wink
Wenn Du bei der letzten Zeile zu lesen beginnst, geht's schon ... face-wink

Grüße
bastla
Member: gizmoFR
gizmoFR May 17, 2010 at 12:27:59 (UTC)
Goto Top
Hallo Bastla,
werde mich dann mal mit VBS beschäftigen, schaden kann das ja nichtsface-smile
Und bis ich dann so weit bin werde ich zerlegen und dann Zippenface-smile

Auf jeden Fall vielen Dank für die Hilfe!!!

Grüße aus Frankreich
Member: Biber
Biber May 17, 2010 at 13:55:52 (UTC)
Goto Top
Moin gizmoFR,

Zitat von @gizmoFR:
werde mich dann mal mit VBS beschäftigen, schaden kann das ja nichtsface-smile
Und bis ich dann so weit bin werde ich zerlegen und dann Zippenface-smile
Aber zusätzlich zum Zerlegen und Zippen bitte auch die von LotPinx so erhoffte Code-Formatierung verwenden.

Sonst mach ich die Grenzen dicht... face-wink

Grüße aus dem Land der ordnungsliebenden Kleinkrämer
Biber
Member: gizmoFR
gizmoFR May 17, 2010 at 14:11:46 (UTC)
Goto Top
Hallo Biber,

was willst Du denn jetzt noch formatiert haben?
Der Inhalt des Codes war nicht wichtig, es ging nur darum eine Zeile zu ersetzen...

Ansonsten hol den Zollstock raus! Ein Wortspiel ,-)

Grüße