pukass
Goto Top

Batch: mehrere Zeilen (Blöcke) in einer txt Datei zu einer Variablen hinzufügen

Guten Abend zusammen!

Bin neu hier und habe hier im Forum gesehen, dass sich einige gut in der batch auskennen.
Habe schon mehrere Tage im Internet bzw auch hier im Forum nach einer Lösung gesucht, aber noch nichts passendes gefunden.

Mein Problem:
Ich habe eine Text Datei die so aussieht:

slot: 0
name: hitachi
size: 300 GB
slot: 1
name: hitachi
size: 600 GB
slot: 2
name: hitachi
size: 900 GB
usw.

daraus möchte ich immer jeweils 3 zeilen zu einer Variablen hinzufügen:

var1:
slot: 0
name: hitachi
size: 300 GB

var2:
slot: 1
name: hitachi
size: 600 GB

var3:
slot: 2
name: hitachi
size: 900 GB

habe bisher immer nur Lösungen gefunden, die mir entweder 1 bestimmte Zeile in eine Variable schreiben oder gleich alles

Vielen Dank im voraus
lg Sebastian

Content-Key: 257930

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

Printed on: April 18, 2024 at 05:04 o'clock

Member: Friemler
Friemler Dec 17, 2014 updated at 18:18:20 (UTC)
Goto Top
Hallo Sebastian,

in Batchscript ist es schwierig, einer Variablen zur Laufzeit Zeilenumbrüche hinzuzufügen. Es wäre interessant zu wissen, wie Du die Daten aus der Textdatei weiterverarbeiten möchtest und wie viele solcher Datensätze die Textdatei enthalten kann. Evtl. kann man sich dann eine andere Strategie zur Zwischenspeicherung der Daten überlegen.

Gruss
Friemler
Member: pukass
pukass Dec 17, 2014 at 18:30:02 (UTC)
Goto Top
Hallo Friemler,

die Variablen müssen keine Zeilenumbrüche enthalten. Könnte also auch so aussehen:

var1=slot: 0 name: hitachi size: 300 GB

oder so ähnlich

Die Textdatei beinhaltet alle HDDs die an einem Raid Controller angeschlossen sind. Jede HDD wird mit 3 Zeilen beschrieben (oder auch vielleicht mehr Zeilen, dann aber immer gleich viele pro HDD). Ich möchte also mit den 3 Zeilen bzw. Werten, jede HDD einer Variable zuordnen.

Gruss
Sebastian
Member: Friemler
Friemler Dec 17, 2014, updated at Dec 18, 2014 at 09:46:17 (UTC)
Goto Top
Hallo Sebastian,

das könnte so gehen:
@echo off & setlocal enabledelayedexpansion

set "InFile=In.txt"  
set "DatasetSize=3"  

set /a Cnt=0
set /a Step=0
set /a Idx=0

for /f "usebackq delims=" %%l in ("%InFile%") do (  
  set /a Step=Cnt %% DatasetSize
  if !Step! equ 0 set /a Idx+=1
  call :ExtendVar "Var!Idx!" "%%l"  
  set /a Cnt+=1
)

set "VarName="  
set Var

exit /b



:ExtendVar
  set "VarName=%~1"  
  set "AddValue=%~2"  
  call set "CurValue=%%%VarName%%%"  
  
  if "%CurValue%" equ "" (  
    call set "%%VarName%%=%AddValue%"  
  ) else (
    call set "%%VarName%%=%%%VarName%%% %AddValue%"  
  )
exit /b

In Zeile 3 muss der Pfad zur Eingabedatei eingetragen werden, in Zeile 4 die Länge (in Zeilen) eines Datensatzes.

Das Script erzeugt für jeden Datensatz eine Variable mit dem Namen VarX, wobei X für die 1-basierte Nummer des Datensatzes steht. Der fixe Namensbestandteil kann in Zeile 13 geändert werden, indem bei "Var!Idx!" das Var durch etwas anderes ersetzt wird.

In Zeile 18 werden alle Variablen ausgegeben, deren Name mit Var anfängt. Damit kann der erfolgreiche Abschluss des Scripts überprüft werden. Wenn die o.g. Änderung in Zeile 13 durchgeführt wurde, muss Zeile 18 entsprechend angepasst werden.

Damit bei der abschließenden Ausgabe der erzeugten Variablen nicht auch die während des Scriptlaufs benutzte Variable VarName (fängt auch mit Var an) ausgegeben wird, wird sie in Zeile 17 gelöscht.

Gruß
Friemler
Member: pukass
pukass Dec 18, 2014 at 07:00:19 (UTC)
Goto Top
Hallo Friemler,

Hab die Batch gerade mal ausprobiert und sie läuft super. Vielen Dank dafür.

Eine Frage hätte ich noch: Was muss ich ändern falls ich anstatt der 3 Zeilen 4 oder mehr Zeilen hätte?

Gruß
Sebastian
Member: Friemler
Friemler Dec 18, 2014 at 09:45:07 (UTC)
Goto Top
Hallo Sebastian,

Zitat von @Friemler:

..., in Zeile 4 die Länge (in Zeilen) eines Datensatzes.

Gruß
Friemler
Member: pukass
pukass Dec 18, 2014 at 12:16:12 (UTC)
Goto Top
Hallo Friemler,

Danke. Habs verstanden.

Gruß
Sebastian
Member: pukass
pukass Dec 19, 2014 at 09:19:34 (UTC)
Goto Top
Hallo Friemler,

eine Frage hätte ich doch noch. Hab das Skript in meins eingefügt und funktioniert auch alles. Wie kann man die Ausgabe aller Variablen deaktivieren. Es stört ein bisschen.

Gruß
Sebastian
Member: Friemler
Friemler Dec 19, 2014 updated at 11:11:37 (UTC)
Goto Top
Hallo Sebastian,

hier nochmal der Begleittext zum Script, dort steht alles wesentliche:

Zitat von @Friemler:

In Zeile 3 muss der Pfad zur Eingabedatei eingetragen werden, in Zeile 4 die Länge (in Zeilen) eines Datensatzes.

Das Script erzeugt für jeden Datensatz eine Variable mit dem Namen VarX, wobei X für die 1-basierte Nummer des
Datensatzes steht. Der fixe Namensbestandteil kann in Zeile 13 geändert werden, indem bei "Var!Idx!" das
Var durch etwas anderes ersetzt wird.

In Zeile 18 werden alle Variablen ausgegeben, deren Name mit Var anfängt. Damit kann der erfolgreiche Abschluss des
Scripts überprüft werden. Wenn die o.g. Änderung in Zeile 13 durchgeführt wurde, muss Zeile 18 entsprechend
angepasst werden.

Damit bei der abschließenden Ausgabe der erzeugten Variablen nicht auch die während des Scriptlaufs benutzte Variable
VarName (fängt auch mit Var an) ausgegeben wird, wird sie in Zeile 17 gelöscht.

Gruß
Friemler
Member: pukass
pukass Dec 19, 2014 at 12:39:40 (UTC)
Goto Top
Ah ok! Danke!

Gruß
Sebastian