Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

In Bat text einfügen zur Ausgabe in eine andere Datei

Frage Entwicklung Batch & Shell

Mitglied: gizmoFR

gizmoFR (Level 1) - Jetzt verbinden

16.05.2010 um 09:52 Uhr, 5350 Aufrufe, 12 Kommentare

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???
Mitglied: Marwed
16.05.2010 um 12:51 Uhr
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.
)
Bitte warten ..
Mitglied: bastla
16.05.2010 um 13:12 Uhr
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
Bitte warten ..
Mitglied: gizmoFR
17.05.2010 um 10:54 Uhr
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 bewege

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[0];
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[0]);
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));
}
elsif (($operation eq 'start') || ($operation eq 'stop')
|| ($operation eq 'reset') || ($operation eq 'suspend')) {
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");
Bitte warten ..
Mitglied: bastla
17.05.2010 um 11:41 Uhr
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:
01.
@echo off & setlocal 
02.
set "Datei=D:\Pfad\vmware-cmd.pl" 
03.
>  "%Datei%" type D:\Block1.txt 
04.
>> "%Datei%" echo Vim::login(service_url =^> $url, user_name =^> $username, password =^> "%ROOTPASSWORT%"); 
05.
>> "%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
Bitte warten ..
Mitglied: gizmoFR
17.05.2010 um 12:07 Uhr
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?

Mit freundlichen Grüßen
Bitte warten ..
Mitglied: Biber
17.05.2010 um 12:32 Uhr
[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...

Grüße
Biber
[/ OT]
Bitte warten ..
Mitglied: LotPings
17.05.2010 um 13:50 Uhr
Hallo gizmoFr,

Bitte formatiere deinen Code zur besseren Les-/Referenzier-barkeit unbedingt mit den dafür vorgesehenen Code Tags 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 warten ..
Mitglied: bastla
17.05.2010 um 14:19 Uhr
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

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:
01.
Datei = "D:\Pfad\vmware-cmd.pl" 
02.
PW = "*Das neue Passw0rt*" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
T = fso.OpenTextFile(Datei).ReadAll 
06.
fso.CreateTextFile(Datei).Write Replace(T, "ROOTPASSWORT", PW)
Grüße
bastla
Bitte warten ..
Mitglied: bastla
17.05.2010 um 14:20 Uhr
Hallo LotPings!
Ich kann nur bewundern das bastla dem irgendeinen Sinn abgewinnen konnte
Wenn Du bei der letzten Zeile zu lesen beginnst, geht's schon ...

Grüße
bastla
Bitte warten ..
Mitglied: gizmoFR
17.05.2010 um 14:27 Uhr
Hallo Bastla,
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

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

Grüße aus Frankreich
Bitte warten ..
Mitglied: Biber
17.05.2010 um 15:55 Uhr
Moin gizmoFR,

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.

Sonst mach ich die Grenzen dicht...

Grüße aus dem Land der ordnungsliebenden Kleinkrämer
Biber
Bitte warten ..
Mitglied: gizmoFR
17.05.2010 um 16:11 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...