Frage an batch-file – Batch - Liest den Inhalt einer Datei in einem Array

2

Ich habe eine Textdatei mit zwei Zeilen (sagen wir param.txt), die unten gezeigt wird:

<code>Mar2012
dim1,dim2,dim3,dim4
</code>

Ich möchte diese Datei im Stapel lesen und den Inhalt der ersten Zeile in einer Variablen namens cube_name speichern. Wenn ich die zweite Zeile lese, möchte ich die durch Kommas getrennte Zeichenfolge dim1, dim2, dim3, dim4 aufteilen und ein Array aus vier Elementen erstellen. Ich plane, die Variable und das Array in einem späteren Teil des Skripts zu verwenden.

Der Code, den ich erstellt habe, wird unten angezeigt. Der Code funktioniert nicht wie erwartet.

<code>@echo off & setlocal enableextensions enabledelayedexpansion
set /a count_=0
for /f "tokens=*" %%a in ('type param.txt') do (
set /a count_+=1
set my_arr[!count_!]=%%a
)
set /a count=0
for %%i in (%my_arr%) do (
set /a count+=1
if !count! EQU 1 (
    set cube_name=%%i
)

if !count! GTR 1 (
    set dim_arr=%%i:@=,%
)
)
for %%i in (%dim_arr%) do (
echo %%i
)

echo !cube_name!
</code>

Beim Ausführen des Codes wird Folgendes angezeigt:

<code>C:\Working folder>test2.bat
ECHO is off.
</code>

Das scheint also nicht zu funktionieren und ich kann nicht herausfinden, was ich falsch mache. Ich bin ziemlich neu in der Batch-Skripterstellung, daher wird um Hilfe gebeten

Deine Antwort

2   die antwort
1


Versuchen Sie, dort etwas zu debuggen oder zurückzugeben?

Sie können einfach einige Echos hinzufügen, um zu sehen, warum Ihr Code nicht funktioniert.

<code>@echo off & setlocal enableextensions enabledelayedexpansion
set /a count_=0
for /f "tokens=*" %%a in ('type param.txt') do (
  set /a count_+=1
  set my_arr[!count_!]=%%a
)
echo ### show the variable(s) beginning with my_arr...
set my_arr

echo Part 2----
set /a count=0
echo The value of my_arr is "%my_arr%"
for %%i in (%my_arr%) do (
    set /a count+=1
    echo ## Count=!count!, content is %%i
    if !count! EQU 1 (
        set cube_name=%%i
    )

    if !count! GTR 1 (
        echo ## Setting dim_arr to "%%i:@=,%"
        set dim_arr=%%i:@=,%
        echo 
    )
)
for %%i in (%dim_arr%) do (
    echo the value of dim_arr is "%%i"
)

echo cube_name is "!cube_name!"
</code>

Ausgabe ist

<code>### show the variable(s) beginning with my_arr...
my_arr[1]=Mar2012
my_arr[2]=dim1,dim2,dim3,dim4
Part 2----
The value of my_arr is ""
cube_name is ""
</code>

Wie Sie sehen können, fällt Ihr Teil2 vollständig aus.

3

wie ich es machen würde, aber es funktioniert. Alles danach ist ein Durcheinander. Es sieht so aus, als wären Arrays ein formales Konzept im Batch, wenn dies nicht der Fall ist. Es ist möglich, mit Variablen so zu arbeiten, dass sie an Arrays erinnern. Aber echte Arrays existieren nicht im Batch.

Sie verwenden% my_arr% als ob es ein Array wäre, abermy_arr ist nicht einmal definiert. Sie haben Variablen definiertmein_arr [1] amdmein_arr [2] - Die Klammern und die Nummer sind Teil des Variablennamens.

Es sieht auch so aus, als hätten Sie ein Missverständnis von FOR-Schleifen. Ich empfehle Ihnen, die FOR - Dokumentation (TypHELP FOR von einer Kommandozeile). Schauen Sie sich auch Beispiele auf dieser und anderen Websites an. Der Befehl FOR ist sehr kompliziert, da er viele Variationen aufweist, die dem ungeübten Auge ähneln, sich jedoch grundlegend unterscheiden. Eine ausgezeichnete Ressource für Ihr Verständnis isthttp://judago.webs.com/batchforloops.htm

Angenommen, die Datei hat immer genau 2 Zeilen, würde ich Ihr Problem so lösen

<code>@echo off
setlocal enableDelayedExpansion
set dimCnt=0
<param.txt (
  set /p "cube_name=" >nul
  set /p "dimList=" >nul
  for %%D in (!dimList!) do (
    set /a dimCnt+=1
    set "dim[!dimCnt!]=%%D"
  )
)
echo cube_name=!cube_name!
  for /l %%I in (1 1 !dimCnt!) do echo dim[%%I]=!dim[%%I]!
</code>

Ein nettes Merkmal der obigen Lösung ist, dass in der Liste der Dimensionen in der 2. Zeile eine unterschiedliche Anzahl von Begriffen berücksichtigt wird. Es schlägt fehl, wenn Tabulatoren, Leerzeichen, Semikolon, Gleiche,* oder? in den Dimensionsnamen. Es gibt relativ einfache Möglichkeiten, um diese Einschränkung bei Bedarf zu umgehen.

Tabulatoren, Leerzeichen, Semikolon und Gleichheitszeichen können mithilfe von Suchen und Ersetzen behandelt werden, um jeden Begriff in Anführungszeichen zu setzen.

<code>  for %%D in ("!dimList:,=","!") do (
    set /a dimCnt+=1
    set "dim[!dimCnt!]=%%~D"
  )
</code>

Ich werde die vollständige Lösung hier nicht veröffentlichen, da sie wahrscheinlich nicht benötigt wird. Aber die Handhabung* und / oder? Ersetzen Sie die Kommas durch ein Zeilenumbruchzeichen und wechseln Sie zu einer FOR / F-Anweisung.

Verwandte Fragen