jhb-kaltduscher
Goto Top

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.
For /f "delims=" %%k IN (%#Pfad%%Zeile%)  DO Echo %%k >> %$IniMen%  
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:
For /f "delims=" %%k IN (%#Pfad%%Zeile%)  DO Echo %%k >> %$IniMen%  

Dies geschieht nicht, obwohl alle Werte korrekt gefüllt sind.

back-to-topDie 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=
----
----

back-to-topDas erwartete Ergebnis


Menumaker MenuMaker1.ini
[Main]
Design=0
Title=     Spiele Haupt-Menü
----
----
Menumaker MenuMaker2.ini
[Main]
Design=0
Title=3_Gewinnt Serien + 5*
Icon=
----
----

back-to-topDas tatsächliche Ergebnis


Menumaker MenuMaker1.ini
Menumaker MenuMaker2.ini

back-to-topProgramm-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

::+++++++++++++++++++++++++++++++++++++++++

back-to-topDas 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?

Content-ID: 6591575513

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

Ausgedruckt am: 24.11.2024 um 04:11 Uhr

mayho33
mayho33 01.04.2023 aktualisiert um 13:26:14 Uhr
Goto Top
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!!
batch

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
JHB-Kaltduscher
JHB-Kaltduscher 01.04.2023 um 13:29:21 Uhr
Goto Top
Hallo mayho33

Du hast im Grundsatz recht.
Das ist zu bedenken, ich bin jetzt 80 Jahre jung.
Komme aus der Midrage-Branche IBM AS400 (andere Programmiersprache);
und habe habe eine bestehende Menü-Anwendung (in Batch erstellt) in Pflege.
Ich werde mich nach Erledigung der bestehenden Probleme in Powershell einlesen.
Bis dahin muss ich mich aber mit Batch rumschlagen

MfG JHB-Kaltduscher

PS. Ich habe das Problem gelöst.
Ich werde die Lösung einpflegen.
JHB-Kaltduscher
Lösung JHB-Kaltduscher 01.04.2023 um 13:42:46 Uhr
Goto Top
Hallo

Der Fehler war ein Denkfehler
Ich habe Echo zum Expandieren der Textdatei benutzt,
es hätte aber Type sein müssen.

Vor der Korrektur
:WRITE
 Set Zeile=%1%
 Echo %$IniMak%%Zeile% >> %$IniMen%
 For /f "delims=" %%k IN (%#Pfad%%Zeile%)  DO Echo %%k >> %$IniMen%  
@Goto :EOF

Nach der Korrektur
:WRITE
@Set Zeile=%1%
@Echo %$IniMak%%Zeile% >> %$IniMen%
@Type %Zeile% >> %$IniMen%
@Goto :EOF
läuft alles problemlos.

MfG JHB-Kaltduscher
mayho33
mayho33 01.04.2023 um 14:57:44 Uhr
Goto Top
Boah Ey! AS400... Dieser Begriff bohrte sich von 30 Jahren zuletzt in meine Ohren 🤣🤣

Ich verstehe! Batch war für mich immer schon ein rotes Tuch. Ich setze das höchstens für so sachen wie Robocopy ein. Alles andere erledige ich nach Möglichkeit mit Scripts die man strukturieren kann.

Beste Grüße!
JHB-Kaltduscher
JHB-Kaltduscher 02.04.2023 um 09:51:10 Uhr
Goto Top
Moin
Grüße zurück.
Anwendung arbeitet jetzt.
Trotzdem hast Du Recht.
Batch ist eine Mimose. Zickt andauernd.

Gruß JHB-Kaltduscher