In einer Batch 2mal FOR-Loop arbeitet die zweite Schleife nicht
Hallo
Ich brauche Hilfe bei einem Batch-Problem.
Ich möchte mit zwei FOR-Schleifen Textdaten spezifisch expandieren.
Im Test Programm funktioniert die zweite FOR-Schleife nicht.
Die Textzeilen werden nicht in die Ausgabedatei IniMenu.txt übertragen.
in der ersten FOR wird %%I nach MenuMaker1.ini expandiert.
Es wird mit Echo %$IniMak%%Zeile% >> %$IniMen% der Satz Menumaker MenuMaker1.ini ausgegeben.
In der Zweiten Schleife sollte der Inhalt der Textdatei MenuMaker1.ini hinzugefügt werden:
Dies geschieht nicht, obwohl alle Werte korrekt gefüllt sind.
Steuerdatei >> MenuMaker1.ini (auf Testdaten reduziert)
Textdatei 1 >> MenuMaker1.ini (auf Testdaten reduziert)
Ich weiß nicht mehr weiter.
Wo liegt der Fehler?
Ich brauche Hilfe bei einem Batch-Problem.
Ich möchte mit zwei FOR-Schleifen Textdaten spezifisch expandieren.
Im Test Programm funktioniert die zweite FOR-Schleife nicht.
For /f "delims=" %%k IN (%#Pfad%%Zeile%) DO Echo %%k >> %$IniMen%
in der ersten FOR wird %%I nach MenuMaker1.ini expandiert.
Es wird mit Echo %$IniMak%%Zeile% >> %$IniMen% der Satz Menumaker MenuMaker1.ini ausgegeben.
In der Zweiten Schleife sollte der Inhalt der Textdatei MenuMaker1.ini hinzugefügt werden:
For /f "delims=" %%k IN (%#Pfad%%Zeile%) DO Echo %%k >> %$IniMen%
Dies geschieht nicht, obwohl alle Werte korrekt gefüllt sind.
Die Daten
Steuerdatei >> MenuMaker1.ini (auf Testdaten reduziert)
MenuMaker1.ini
MenuMaker2.ini
Textdatei 1 >> MenuMaker1.ini (auf Testdaten reduziert)
[Main]
Design=0
Title= Spiele Haupt-Menü
----
----
Textdatei 2 >> **MenuMaker2.ini** (auf Testdaten reduziert)
[Main]
Design=0
Title=3_Gewinnt Serien + 5*
Icon=
----
----
Das erwartete Ergebnis
Menumaker MenuMaker1.ini
[Main]
Design=0
Title= Spiele Haupt-Menü
----
----
Menumaker MenuMaker2.ini
[Main]
Design=0
Title=3_Gewinnt Serien + 5*
Icon=
----
----
Das tatsächliche Ergebnis
Menumaker MenuMaker1.ini
Menumaker MenuMaker2.ini
Programm-Code
@ECHO ON
@Setlocal EnableExtensions
@Color 70
SET #Pfad=%~dp0
SET $From=%~d0\$Spiele
SET $To=%~d0\##Move
Set $IniCpy=%#Pfad%IniCopy.txt
Set $IniMen=%#Pfad%IniMenu.txt
Set $IniMak="Menumaker "
Call :INIMAK %$IniMak%
@Echo *-Expandieren -*---------------------
IF Exist %$IniMen% DEL %$IniMen%
For /f "delims=" %%I IN (%$IniCpy%) DO Call :WRITE %%I %%I
@Echo *-ENDE-*----------------------------- & @Pause
@Goto :EOF
::+++++++++++++++++++++++++++++++++++++++++
:WRITE
@Echo *-WRITE_In-*----------
Set Zeile=%1%
Echo %$IniMak%%Zeile% >> %$IniMen%
For /f "delims=" %%k IN (%#Pfad%%Zeile%) DO Echo %%k >> %$IniMen%
@Echo *Anzeige-%$IniMen%-*---
@Type %$IniMen%
@Echo *-WRITE_Out-*----------
@Goto :EOF
:COPY
Echo %2% >> %$IniMen%
pause
@Goto :EOF
:INIMAK
Set $IniMak=%~1%
@Goto :EOF
::+++++++++++++++++++++++++++++++++++++++++
Das Job-Protokoll
O:\##Test>SET #Pfad=O:\##Test\
O:\##Test>Set $IniCpy=O:\##Test\IniCopy.txt
O:\##Test>Set $IniMen=O:\##Test\IniMenu.txt
O:\##Test>Set $IniMak="Menumaker "
O:\##Test>Call :INIMAK "Menumaker "
O:\##Test>Set $IniMak=Menumaker
*-Expandieren -*---------------------
O:\##Test>IF Exist O:\##Test\IniMenu.txt DEL O:\##Test\IniMenu.txt
O:\##Test>For /F "delims=" %i IN (O:\##Test\IniCopy.txt) DO Call :WRITE %i
O:\##Test>Call :WRITE MenuMaker1.ini
*-WRITE_In-*----------
O:\##Test>Set Zeile=MenuMaker1.ini
**O:\##Test>Echo Menumaker MenuMaker1.ini 1>>O:\##Test\IniMenu.txt <<< 1.Ausgabe**
**O:\##Test>For /F "delims=" %k IN (O:\##Test\MenuMaker1.ini) DO Echo %k 1>>O:\##Test\IniMenu.txt**
*Anzeige-O:\##Test\IniMenu.txt-*--- **%k wird nicht expandiert**
Menumaker MenuMaker1.ini
*-WRITE_Out-*----------
O:\##Test>Call :WRITE MenuMaker2.ini
*-WRITE_In-*----------
O:\##Test>Set Zeile=MenuMaker2.ini
O:\##Test>Echo Menumaker MenuMaker2.ini 1>>O:\##Test\IniMenu.txt
O:\##Test>For /F "delims=" %k IN (O:\##Test\MenuMaker2.ini) DO Echo %k 1>>O:\##Test\IniMenu.txt
*Anzeige-O:\##Test\IniMenu.txt-*---
**Menumaker MenuMaker1.ini <<< 1.Ausgabe**
Menumaker MenuMaker2.ini
*-WRITE_Out-*----------
*-ENDE-*-----------------------------
Drücken Sie eine beliebige Taste . . .
Ich weiß nicht mehr weiter.
Wo liegt der Fehler?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6591575513
Url: https://administrator.de/forum/in-einer-batch-2mal-for-loop-arbeitet-die-zweite-schleife-nicht-6591575513.html
Ausgedruckt am: 25.12.2024 um 07:12 Uhr
5 Kommentare
Neuester Kommentar
Hi,
Mir drängt sich folgende Frage auf, und "Sorry", wenn ich das so sage, aber welcher Geist muss einen reiten um im Jahr 2023 derlei Aufgaben noch mit Batch zu lösen?
Klar! Batch ist in vielen Bereichen noch immer nicht wegzudenken, etwa um unkompliziert ein Setup aufzurufen oder schnell mal irgendwelche Systemspezifika zu callen oder zu ändern... Das war es dann aber auch schon.
Seit 1995 gibt es WSH (Windos Scripting Host) aka VBScript. Also seit mindestens 28 Jahren. Und damit wäre deine Aufgabe gut nachvollziehbar gelöst. Eine FOR-Schleife in Batch bedingt nämlich eine andere Syntax wenn sie in einem Script abgearbeitet werden soll:
klingt für mich total logisch ....nicht!!
Seit 2006 gibt es Powershell. Seit v3 findet man es ad hoc ohne zusätzliche Installationen auf jedem Windows OS. Und damit wäre deine Aufgabe wohl mit nur ~10 Zeilen Code gelöst.
Warum tust du dir also nicht selbst einen Gefallen und steigst um auf Powershell? Das ist fast durchwegs logisch aufgebaut, man kann Dot.Net-Framework verwenden, es lässt sich z.B. C#-Code darin verwenden und außerdem vereint es so ziemlich alle Anwendungsmöglichkeiten die Batch und VBScript bieten. Nur einfacher, wenn man es einmal begriffen hat.
@colinardo hat dazu einen sehr guten Anfänger-Leitfaden erstellt:
Powershell Leitfaden für Anfänger
Mir drängt sich folgende Frage auf, und "Sorry", wenn ich das so sage, aber welcher Geist muss einen reiten um im Jahr 2023 derlei Aufgaben noch mit Batch zu lösen?
Klar! Batch ist in vielen Bereichen noch immer nicht wegzudenken, etwa um unkompliziert ein Setup aufzurufen oder schnell mal irgendwelche Systemspezifika zu callen oder zu ändern... Das war es dann aber auch schon.
Seit 1995 gibt es WSH (Windos Scripting Host) aka VBScript. Also seit mindestens 28 Jahren. Und damit wäre deine Aufgabe gut nachvollziehbar gelöst. Eine FOR-Schleife in Batch bedingt nämlich eine andere Syntax wenn sie in einem Script abgearbeitet werden soll:
klingt für mich total logisch ....nicht!!
Seit 2006 gibt es Powershell. Seit v3 findet man es ad hoc ohne zusätzliche Installationen auf jedem Windows OS. Und damit wäre deine Aufgabe wohl mit nur ~10 Zeilen Code gelöst.
Warum tust du dir also nicht selbst einen Gefallen und steigst um auf Powershell? Das ist fast durchwegs logisch aufgebaut, man kann Dot.Net-Framework verwenden, es lässt sich z.B. C#-Code darin verwenden und außerdem vereint es so ziemlich alle Anwendungsmöglichkeiten die Batch und VBScript bieten. Nur einfacher, wenn man es einmal begriffen hat.
@colinardo hat dazu einen sehr guten Anfänger-Leitfaden erstellt:
Powershell Leitfaden für Anfänger