oldroadrunner
Goto Top

Probleme beim ändern einer Zeile in einer .ws Datei per Batch!

Ich weiß das Thema ist abgegriffen. Es sind hier viele tolle Beiträge dazu geschrieben worden.
Leider reicht das scheinbar für mein Problem nicht aus.

Problem:

In unserem Hause wird Client Access für AS400 Sitzungen eingesetzt.
Nun haben wir unterschiedliche Versionen installiert.
Grundsätzlich kein Problem.
Leider gibt es immer Probleme wenn sich ein User an einer älteren Version anmeldet wenn er vorher
an einen Rechner gesessen hat der eine neuere Version der besagten Software hat.
Durch die Änderung eines einzelnen Wertes ( Version= ) kann man aber gleich wieder arbeiten.
Diesen Vorgang möchte ich aber automatisieren.
Hier ein kurzer Auszug aus der Konfig-Datei:

[Profile]
ID=WS
Version=8
[CT]
trace=Y
[Telnet5250]

Um die Probleme zu beheben müßte mein Programm nach "Version" suchen und nachschauen ob dort die "8" steht.
Wenn ja sollte der Wert auf "7" geändert werden.
Leider hatte ich mit einigen Beispielen keinen Erfolg oder komische Ergebnisse (z.B. "8=Version=8" ...etc)
Ich versuche mich da schon 4 Wochen und bin da echt am verzweifeln da ich wenig Kenntnisse über die Einbundung von Variablen etc. habe.
Könnte mir jemand helfen und wenn ja mir das vollständige Skript (Batchprogramm) zur Verfügung stellen, da ich glaube das viele Beispiele hier nur Teile eines Programms sind.

Herzlichen Dank

Content-Key: 153674

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

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: laster
laster 25.10.2010 um 09:14:38 Uhr
Goto Top
Hallo OldRoadrunner,

kein Problem, hier ein Javascript (aendern.js):
var konfigdatei = "orginale-konfigdate.dat";  
var fp1 = OpenFile(konfigdatei, "r");    
var konfiguration = fp1.ReadAll(); 
fp1.Close();

var konfigdateineu = "veraenderte-konfigdatei.dat"  
var fp2 = CreateFile(konfigdateineu);

var zeilen = konfiguration.split("\r\n");  

for (i = 0; i < zeilen.length; i++) {
  if (zeilen[i].indexOf("Version=8") == 0) {  
    fp2.WriteLine("Version=7");  
  } else {
    fp2.WriteLine(zeilen[i]);
  }
}

fp2.Close();

// Hilfsfunktionen

/** Open TextDatei.
 * @param name String kompletter Dateiname
 * @return tf  Objekt FilePointer
 */
function OpenFile(name, mod) {
  var fso, tf, mode;
  if (mod == "r") {  
    mode = 1;
  }  
  if (mod == "w") {  
    mode = 2;
  }  
  if (mod == "a") {  
    mode = 8;
  }  
  fso = new ActiveXObject("Scripting.FileSystemObject");  
  tf = fso.OpenTextFile(name, mode);
  return tf;
}

/** Create TextDatei.
 * @param name String kompletter Dateiname
 * @return tf  Objekt FilePointer
 */
function CreateFile(name) {
  var fso, tf;
  fso = new ActiveXObject("Scripting.FileSystemObject");  
  tf = fso.CreateTextFile(name, true);
  return tf;
}

am Ende muss die neu erstellte Datei noch umkopiert werden:

@echo off
cscript /nologo aendern.js
copy /Y veraenderte-konfigdatei.dat orginale-konfigdate.dat
:: Starte Dein Client Access für AS400 Programm

vG
LS
Mitglied: OldRoadrunner
OldRoadrunner 25.10.2010 um 09:38:17 Uhr
Goto Top
Danke Dir.
Wie rufe ich das den jetzt auf.
Habe es schon angepaßt.
Die Clients müssen das beim Anmelden per Script automatisch aufrufen.
Zum Glück liegt die zu ändernde Datei im Ordner "Eigene Dateien".

Per Batch wäre mir das lieber , aber wenn es funktioniert ;o)
Gruß
AP
Mitglied: laster
laster 25.10.2010 um 09:43:02 Uhr
Goto Top
Wie rufe ich das den jetzt auf.
eine Batchdatei erstellen mit dem Inhalt der letzten 4 Zeilen aus obiger Antwort face-smile
vG
LS
Mitglied: OldRoadrunner
OldRoadrunner 25.10.2010 um 09:57:38 Uhr
Goto Top
Puhhhh................ das läuft nicht............... :o(

Eingabefehler: Für die Dateierweiterung ".js" gibt es kein Skriptmodul

So wird es warscheinlich an allen PC´s enden.
Mitglied: laster
laster 25.10.2010 um 10:02:24 Uhr
Goto Top
Was sind denn das für Clients?
Wenn das Windows-Clients sind (wenigstens W2k) kannst Du doch die Scriptmodule installieren, musst Du halt einmal machen.
LS
Mitglied: bastla
bastla 25.10.2010 um 10:13:49 Uhr
Goto Top
Hallo OldRoadrunner und willkkommen im Forum!

Als Alternative noch eine "Batch-only"-Variante:
@echo off & setlocal
set "Conf=%userprofile%\Eigene Dateien\Config.txt"  
set "Von=Version=8"  
set "Nach=Version=7"  

set "ZNr="  
for /f "delims=:" %%i in ('findstr /n /x /c:"%Von%" "%Conf%"') do set "ZNr=%%i"  
if not defined ZNr goto :Starten

move "%Conf%" "%Conf%.bak"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Conf%.bak"') do (  
    if "%%i" neq "%ZNr%" (  
        echo\%%j
    ) else (
        echo\%Nach%
    )
)>>"%Conf%"  

:Starten
::Aufruf Client
In dieser Version wird die Konfig-Datei nur neu erstellt, wenn sie eine Zeile "Version=8" enthält (Achtung: wegen des "/x" beim "findstr" wird auf exakte Übereinstimmung der gesamten Zeile geprüft - falls es zB am Ende der Zeile noch ein oder mehrere Leerzeichen gäbe, könntest Du auch weniger genau mit "/b" nur nach dem Zeilenanfang suchen lassen). Die alte Datei verbleibt dabei mit dem Zusatz ".bak" als Sicherungskopie.

Bitte beachten: Ersetzt wird (in dieser Fassung) nur die letzte (falls es mehrere geben sollte) passende Zeile! [Edit] Außerdem wird bei Zeilen, welche mit einem ":" beginnen, dieser nicht in die neue Datei übernommen! [/Edit]

Kurze Erklärung zum Ablauf:
In einem ersten Suchlauf wird nach dem Suchbegriff lt Variable "%Von%" gesucht und, falls eine oder mehrere entsprechende Zeilen gefunden werden, die Zeilennummer der letzten Fundstelle in "%ZNr%" vermerkt.
Wurde keine passende Zeile gefunden, wird gleich das Client-Programm aufgerufen.

Ist die gesuchte Zeile enthalten, wird zunächst die Sicherungskopie erstellt (mit "move" wird dabei automatisch - in einem Batch ist für "move" und auch "copy" kein Schalter "/y" erforderlich - eine ev schon bestehende ältere Sicherung überschrieben) und dann aus dieser Datei alle (inkl Leerzeilen) Zeilen ausgelesen und, soferne es sich nicht um die zu ersetzende Zeile handelt, unverändert in die Konfig-Datei geschrieben. Das Auslesen aller Zeilen wird durch die Verwendung des Suchbegriffes "^" sichergestellt, da auch leere Zeilen einen "Zeilenanfang" haben. Mit der Schreibweise "echo\%%j" (es wären anstelle des "\" auch verschiedene andere Zeichen - häufig wird ein Punkt verwendet - möglich) wird sicher gestellt, dass eine Leerzeile nicht als "ECHO ist eingeschaltet (ON)." geschrieben wird.
Für die zu ersetzende Zeile wird anstelle des Originalinhaltes dann eben "%Nach%" geschrieben.

Nach Bearbeitung aller Zeilen wird das Clientprogramm gestartet

Grüße
bastla
Mitglied: OldRoadrunner
OldRoadrunner 25.10.2010 um 10:59:29 Uhr
Goto Top
Also ich bin echt begeistert.

@laster : Danke für Deine schnelle Hilfe. Das mit dem Java hätte sicher auch prima funktioniert wenn die Clients das unterstützt hätten.

@bastla : Cooles Ding das geht prima und ist schon integriert in das alltägliche Scripting.
Danke für die tolle Erklärung, damit kann selbst ich die Funktionen dieses Scriptes einigermaßen durchdringen ;o)

DANKESCHÖN!