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

Keine Applikation zum Ausführen einer Batch Datei vorhanden

Keine Applikation zum Ausführen einer Batch Datei vorhanden: Sobald ich ich versuche eine .bat Datei zu starten steht dort das die Nötige Applikation auf meinem PC fehlt. Weiterlesen...

Windows 10 Support Dienstag um 19:02 Uhr

Win 10 Systemwiederherstellung startet verzögert

Win 10 Systemwiederherstellung startet verzögert: Hallo an Alle Ich habe auf meinem Notebook festgestellt,daß bei Aufrufen der systemwiederherstellung diese mit 1-2 Min. verzögert startet. Wie lange diese Störung schon besteht weiß ich nicht. Ich habe auch keine Idee zur Lösung außer das ganze System neu aufzuspielen. Hat jemand da eine...

Windows 10 Support 13. April 2019

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

Batch-Skript zur Ausführung in Win 10 pro

Batch-Skript zur Ausführung in Win 10 pro: Ich suche nach einem Batch-Skript, das es kann: Ziehen Sie die einreihige Taskleiste in eine 3-reihige Taskleiste und verriegeln Sie sie an ihrem ursprünglichen Platz (unten). Ändern Sie das Zeitformat in der rechten unteren Ecke von Standard auf z.B. "2:00 Uhr" in der ersten Reihe,...

Windows 10 Support 29. November 2018

Batch-Datei zur Aktivierung von GPE in Windows 10 Home

Batch-Datei zur Aktivierung von GPE in Windows 10 Home: Zuerst einmal vielen Dank, dass du mich ins Forum gelassen hast. Ich hatte eine große Hilfe beim Schwester Windows 7 Forum, aber jetzt beginne ich, mich auf W10 einzustellen. Ich habe es erst gestern installiert und finde gerade heraus, wie alles funktioniert, soweit es meine Anforderungen...

Windows 10 Support 29. November 2018

Windows 10 Bildschirmauflösung mit batch Datei ändern

Windows 10 Bildschirmauflösung mit batch Datei ändern: Hallo Ich möchte gerne zwei batch Dateien erzeugen mit denen ich jeweils folgendes machen kann: Auflösung auf 1920 * 1080 stellen und Auflösung auf 1024 * 768 stellen Wie geht das mit onboard Mitteln? Weiterlesen...

Windows 10 Support 18. November 2017

Mit Batch Datei Ordnerverknüpfung kopieren

Mit Batch Datei Ordnerverknüpfung kopieren: WINDOWS 10: Ich würde gerne über eine Batch- Datei eine Ordnerverknüpfung, keine normale Verknüpfung über einen batch befehl kopieren. Wenn ich es aber mit xcopy /y oder nur mit copy versuche heißt der Dateiordner im Zielpfad...

Windows 10 Support 1. Juni 2017

Batch Datei über UNC-Pfad aufrufen aus Netzwerk

Batch Datei über UNC-Pfad aufrufen aus Netzwerk: Hallo, ich betreibe ein Netzwerk mit diversen Windows 7 PCs. Diese haben alle im Autostart eine start.bat, die nur einen Aufruf enthält: call \\server\logon\anmeldung.bat Damit wird ein Anmeldescript, welches auf einem Server liegt, aufgerufen. Das Problem: Nun habe ich den ersten PC auf...

Windows 10 Support 1. April 2016

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

Andere User suchten nach Lösungen mit:

  1. batch wartepunkt win 10