Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien

Helfe beim Thema Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien in Windows 10 Support um eine Lösung zu finden; Ich habe dieses schon seit Stunden recherchiert, kann aber keine Fortschritte machen..... Ich habe einen Ordner mit 3 Dateien darin, der so... Dieses Thema im Forum "Windows 10 Support" wurde erstellt von hsehestedt, 21. Dezember 2018.

  1. hsehestedt
    hsehestedt Gast

    Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien


    Ich habe dieses schon seit Stunden recherchiert, kann aber keine Fortschritte machen.....



    Ich habe einen Ordner mit 3 Dateien darin, der so aussieht:



    ISO-Images

    > × × × Bild 1.iso

    > × × × Bild 2.iso

    > × × × Bild 3.iso



    Ich habe eine Batch-Datei, die eine gewisse Verarbeitung dieser ISO-Abbilder durchführt, aber ich habe es wirklich schwer, einige Verhaltensweisen herauszufinden.



    Unten ist ein Beispiel für Code, der zeigt, wo meine Zwickmühle ist. Ich erwarte, dass die FOR-Schleife den vollständigen Pfad und Dateinamen jeder Datei in ein Array namens SourceFile[x] setzt, wobei x eine Zahl von 1 bis 3 ist.



    Ich habe ein paar Echoanweisungen in der FOR-Schleife, die mir zeigen, dass alle Werte genau das sind, was ich erwarte und dass alles innerhalb der FOR-Schleife gut funktioniert.



    Nachdem ich jedoch aus der FOR-Schleife ausgeschieden bin, scheinen die Variablen SourceFile[x] ihre Werte nicht mehr zu halten.









    Hier ein Beispielclip von etwas Code und was tatsächlich passiert:



    Hinweis: Ich führe diese Batchdatei als Admin aus.



    Der Codeclip:

    ________________

    @echo off

    setlocal aktiviert verzögerte Erweiterung



    set SourceDir="D:\ISO Images".

    setzen /a count=0



    für %%a in (!SourceDir!\*.iso) do (

    setzen /a count=count+1

    setze "SourceFile[%count%]=%%%a".



    echo Der Wert der Zählung ist: !count!

    echo Der Wert von a is: %%a

    echo Der Wert von SourceFile[!count!] ist: !SourceFile[%count%]!

    Echo.

    )

    Echo.

    Echo.

    echo Der aktuelle Wert der Zählung ist: %count%.

    echo %SourceDatei[%Anzahl%]%

    echo %QuelleDatei[1]%

    ________________





    Hier ist die resultierende Ausgabe:



    _____________________

    Der Wert der Zählung ist: 1

    Der Wert von a ist: D:\ISO Images\Image 1.ISO

    Der Wert von SourceFile[1] ist: D:\ISO Images\Image 1.ISO



    Der Wert der Zählung ist: 2

    Der Wert von a ist: D:\ISO Images\Image 2.ISO

    Der Wert von SourceFile[2] ist: D:\ISO Images\Image 2.ISO



    Der Wert der Zählung ist: 3

    Der Wert von a ist: D:\ISO Images\Image 3.ISO

    Der Wert von SourceFile[3] ist: D:\ISO Images\Image 3.ISO







    Der aktuelle Wert der Zählung ist: 3

    Anzahl

    ECHO ist aus.

    Drücken Sie eine beliebige Taste, um fortzufahren. . .

    __________________



    Es gibt also ein paar Fragen:



    1) Warum hält mein Array (SourceFile[x]) keine Werte, nachdem ich aus der FOR-Schleife gekommen bin?



    2) Diese Frage bedarf einer kleinen Erklärung.....



    Zuerst muss ich mein Verständnis von verzögerter Expansion erklären, um sicherzustellen, dass ich dies richtig verstanden habe. Mein Verständnis ist, dass innerhalb eines Blocks (innerhalb der Klammern einer "for"- oder "if"-Struktur, zum Beispiel, oder auf einer einzigen Codezeile) Variablen erweitert oder mit ihren Werten versehen werden, bevor der Code tatsächlich ausgeführt wird. Mein Verständnis ist, dass bei aktivierter verzögerter Expansion die Variablen erst zum letzten möglichen Zeitpunkt, d.h. wenn der Code ausgeführt wird und tatsächlich auf die Variable verweist, erweitert werden (zugewiesene Werte). Dazu muss die Variable wie folgt referenziert werden: !MyVariable!, und nicht so: %MeineVariable%.



    Aus meinen Tests geht hervor, dass das Setzen des Wertes einer Variablen mit einem "Set" nicht die Verwendung von ! statt der % erfordert. Zum Beispiel muss ich innerhalb der FOR-Schleife die Option

    setze "SourceFile[%count%]=%%%a".

    NICHT

    setze "Quelldatei[!count!]=%%%a".



    Also mit all dem, was gesagt wurde, in der Zeile, die lautet.

    echo Der Wert von SourceFile[!count!] ist: !SourceFile[%count%]!

    warum muss ich die Variable am Ende dieser Zeile als !SourceFile[%count%]! und nicht als !SourceFile[!count!]! referenzieren?



    Wenn ich es als !SourceFile[!count!]! beziehe, dann lautet meine Ausgabe

    Der Wert von SourceFile[3] ist: count

    anstatt

    Der Wert von SourceFile[3] ist: D:\ISO Images\Image 3.ISO



    Zusammenfassend lässt sich also sagen, dass es eine Frage bezüglich der Syntax für verzögerte Expansion gibt und die Frage, warum meine Array-Variablen ihre Werte verlieren, nachdem sie aus der FOR-Schleife kommen.
     
  2. Hobi Expert
    Willkommen,

    Klicke die folgenden Schritte durch:
  3. Try3
    Try3 Gast

    Um bei der Diagnose zu helfen, fügen Sie ein allgemeineres Echo hinzu, das alle Ihre SourceFile*-Variablen auflistet.

    Code:
    Code:
    Quelldatei setzen
    Denis
     
  4. hsehestedt
    hsehestedt Gast
    Denis,



    Dank für die Antwort. Ich habe deinen Vorschlag ausprobiert, aber es ist nur, das zurückzugeben:



    Quelldatei setzen

    Drücken Sie eine beliebige Taste, um fortzufahren. . .



    Ich habe auch "echo %SourceFile%" (ohne das Set) außerhalb der FOR-Schleife und "echo !SourceFile!" versucht, aber das gibt einfach "ECHO ist aus" zurück.
     
  5. Try3
    Try3 Gast
    Sorry, ich habe nicht überprüft, was ich richtig geschrieben habe. Jetzt korrigiert.



    Ich wollte vorschlagen, das Hinzufügen von

    Code:
    Code:
    Quelldatei setzen
    weil das alle Variablen auflistet, die mit der Zeichenkette SourceFile beginnen. Hier ist ein Demo-Schläger

    Code:
    code]set fred1=aaaaaa set fred2=bbbb set fred3=cccc set fred pause[/code]

    die als Reaktion auf die gesetzte fred-Linie zurückgibt,

    Code:
    Code:
    fred1=aaaaaa fred2=bbbbbb fred3=cccccc



    Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien




    Denis
     
  6. hsehestedt
    hsehestedt Gast
    Okay, das war eine wirklich clevere Idee. Das ergab, dass meine Variablen tatsächlich die richtige Valuse enthalten und dass es genau so ist, wie ich versuche, den Wert der Variablen zu drucken, der schuldig zu sein scheint. Ich habe ein paar neue Ideen, die ich ausprobieren werde.



    Entschuldigung für den Mangel an Details hier, aber ich bin im Moment etwas knapp bei Kasse. Ich werde später mit weiteren Details antworten.



    In der Zwischenzeit vielen Dank für die geniale Idee. Ich wusste nicht, dass das möglich ist!
     
  7. Try3
    Try3 Gast
    Es wäre jedoch eine brillantere Idee gewesen, wenn ich sie beim ersten Mal richtig geschrieben hätte.



    Ich denke, dass Ihr Problem darin besteht, wie Sie sich auf die Variablen nach der For-Schleife beziehen. Das Problem wird nicht durch die DelayedExpansion selbst verursacht. Variablen, die aus anderen Variablen bestehen, müssen in einer bestimmten Weise referenziert werden. Später hinzugefügt - @bro67-Links leisten wahrscheinlich eine bessere Arbeit als meine grundlegenden Beispiele unten.



    Hier ist eine einfache Demo -

    Code:
    Eingabeaufforderung $g Set X=New Set Y=Diese Variable wird am Ende überhaupt nicht verwendet Set YNew=Dies ist die Variable, die tatsächlich echoed Anruf-Echo erhält %%Y%X%%% Pause bei EndVarNamingDemo[/code].

    und erzeugt diese Ausgabe Code:
    Code]>Set X=Neu >Set Y=Diese Variable wird am Ende überhaupt nicht verwendet >Set YNew=Dies ist die Variable, die tatsächlich echoed wird >Call echo %YNew% Dies ist die Variable, die tatsächlich echoed wird >Pause at EndVarNamingDemo Drücken Sie eine beliebige Taste, um fortzufahren. ...[/code]




    Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien




    Die Kombination aus Call before the Echo zwingt die Fenster, den seltsamen Leitungsaufruf echo %%Y%X%%% zweimal zu analysieren.

    Das erste Mal, wenn es parst, kann es %X% nur verstehen und lösen, aber wenn es parst, reduziert es auch die restlichen %%% auf %.

    Also, während des zweiten Parse, alles, was es sieht, ist der Aufruf echo %YNew% und es ist sehr glücklich, diesen Befehl zu implementieren.

    Es hinterlässt keine sichtbare Spur von seinem Double Parsing, was die Fehlersuche erschweren kann.



    Übrigens vermeide ich DelayedExpansion, wann immer ich kann, weil ich die Konstruktion von Multibefehlen schwierig zu debuggen finde[ich musste Ihre mehrmals lesen, bevor ich das Gefühl hatte, dass ich nützlich reagieren konnte]. Stattdessen, wenn eine For-Schleife mehr als einen einzelnen Befehl beinhaltet, verwende ich Unterprogramme und finde diese einfacher zu debuggen. Dies ist ein harmloses Beispiel für die von mir verwendete Struktur.



    Code:
    code]::Konstanten Set TargetFolder=%~dp0 Set TargetFolder=%TargetFolder:~0,-1% Set TargetFiles=*.* ::Anfangsbedingungen set /a count=0 :: Verarbeiten Sie jede der TargetFiles im TargetFolder FOR /F "tokens=*" %%X IN (' Dir "%TargetFolder%\%TargetFiles%" /b ') Rufen Sie :TestSub "%%X" GoTo EndSubRoutineDemo :TestSub :: Verarbeiten Sie den übergebenen Parameter GoTo :EOF :EndSubRoutineDemo Pause bei EndSubRoutineDemo nur um einen Blick während dieses Tests zu werfen[/code].

    Denis
     
  8. bro67
    bro67 Gast
  9. hsehestedt
    hsehestedt Gast

    Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien

    Das war der Trick! Mit "Call" wurde die Straßensperre gelöst, der ich gegenüberstand.



    Was ich tue, ist die Überarbeitung einer Rohfassung einer Batch-Datei, die ich vor ein paar Wochen erstellt hatte, und ich poliere sie jetzt auf. Die Batch-Datei würde ursprünglich ein Windows ISO-Image kopieren, es öffnen, den Inhalt an einen temporären Speicherort kopieren, alle neuesten Windows-Aktualisierungen einspielen und dann ein neues ISO-Image mit allen eingegebenen Updates erstellen.



    Da ich mehrere ISO-Images mit verschiedenen unbeaufsichtigten Setup-Konfigurationen habe, möchte ich jetzt nur die Batch-Datei aktualisieren, um alle ISO-Images in einem Ordner durchzugehen und alle zu aktualisieren.



    Dank deiner Hilfe ist mein Roadbloack jetzt geräumt.



    Danke, dass du dir die Zeit genommen hast zu antworten. Ich kann dir gar nicht sagen, wie frustrierend es war, stundenlang nichts zu erreichen.
     
Thema:

Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien

Die Seite wird geladen...

Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien - Ähnliche Themen - Verzögerte Erweiterung Arrays

Forum Datum

In einer Batch Datei Admin Abfrage automatisch bestätigen

In einer Batch Datei Admin Abfrage automatisch bestätigen: Hallo zusammen, ich habe eine Batch Datei erstellt, die automatisch mehrere Programme nacheinander ausführt. Zwei dieser Probgramme (in rot dargestellt) brauchen eine Admin Freigabe, die ich dann immer "manuell" ausführe. @Echo OFF ECHO Programme werden gestartet... START "iRacing" /B...

Windows 10 Allgemeines 12. Dezember 2022

Dateien mit Batch Datei bewegen?

Dateien mit Batch Datei bewegen?: Ok also ich möchte Dateien von einem Verzeichnis ins andere Bewegen, und die Dateien sozusagen austauschen. Beispiel: In C:\OrdnerA ist eine .png datei mit dem Namen "Hans" In C:\OrdnerB ist eine .png datei mit dem Namen "Sepp" Ich möchte dass: In C:\OrdnerA ist eine .png datei mit dem Namen...

Windows 10 Support 20. September 2021

Batch-Datei Tastatursteuerung?

Batch-Datei Tastatursteuerung?: Hallo, ich möchte in einer Batch-Datei eine Tastatursteuerung hinzufügen. Ich meine so etwas, wie das: set /p ANSWER="Wollen Sie fortfahren? [Ja/Nein] > " if /i %ANSWER%==Ja (set "ANSWER=" & goto S1) if /i %ANSWER%==Nein (set "ANSWER=" & goto S2) nur ohne, dass man nach der Eingabe "Enter"...

Windows 10 Support 10. August 2021

Batch Datei

Batch Datei: Hallo Zusammen, dies ist mein erster Post in diesem Forum. Eine Problem mit dem kopieren von Dateien. Auf Laufwerk T ist in Ordner1 der Ordner2 und in Ordner 2 ist Ordner 3 in dem eine XLSX datei ist. Gerne würde ich diese xlsx Datei über eine Batch Datei sichern in: Laufwerk P Ordner 1...

Windows 10 Allgemeines 12. Februar 2021

Batch Dateien mit Batch erstellen?

Batch Dateien mit Batch erstellen?: Wie erstellt man Batch und VBS Dateien mit Batch? Also eine Batch Datei schreiben die ich nacher zu exe umwandele dass bei einen bestimmten Verzeichnis neue Ordner erstellt und dann selber Batch und VBS Dateien erstellt mit einen bestimmten Inhalt und sie dann im erstellten Ordner abspeichert....

Windows 10 Support 8. Juli 2020

Wie kann ich eine Batch-Datei mit einer Python Datei ausführen?

Wie kann ich eine Batch-Datei mit einer Python Datei ausführen?: Hallo, Ich möchte dass eine Batch-Datei automatisch startet (Auto-Start), aber man kann doch nur EXE-Dateien in den Autostart-Ordner packen/werden von diesem akzeptiert. Deshalb wollte ich ein Python-Skript schreiben, dass die Batch-Datei öffnet, das Python-Programm dann in eine EXE-Datei...

Windows 10 Support 12. Mai 2020

Windows 10 dateien bewegen sich verzögert?

Windows 10 dateien bewegen sich verzögert?: Wenn ich irgendein Icon auf meinem Desktop verschiebe hat es einen kleinen Delay bis es am neuen Ort erscheint.. Der Bug kam plötzlich. Habe schon viel probiert bisher ohne jeglichen Erfolg. Anti Virus drüber laufen lassen. IconCache etc refreshed. Explorer.exe neugestartet Danke im vorraus....

Windows 10 Support 13. April 2020

Batch Datei öffnen

Batch Datei öffnen: Hallo, ich hätte da mal eine Frage! Ich möchte eine Batch Datei starten/öffnen, allerdings wird dieser Text bei mir angezeigt "Diese App kann auf dem Pc nicht ausgeführt werden. Wenden Sie sich an den Softwareherausgeber, um eine geeignete Version für Ihren Pc zu finden." Kann mir da...

Windows 10 Support 2. April 2019

Verzögerte Erweiterung und Arrays in Win 10 Batch-Dateien [gelöst]

Andere User suchten nach Lösungen mit:

  1. batch if variable verzögerter erweiterung

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Information ausblenden