Batch: Unerwartete variable Ergebnisse in der Subroutine

Batch: Unerwartete variable Ergebnisse in der Subroutine

Eine Antwort aufeine vorherige Frageschlägt diese FOR-Zeile vor. Jetzt versuche ich, die Variable zu verwenden. Mein aktuelles Batch-Skript:

@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 %%G
:sub1
echo %%G
set apath=%%~G
echo %apath%
goto :eof
:End

Die Ausgabe dieses Skripts besteht aus sieben Iterationen davon:

%G
%~G

Die Subroutine scheint etwas mit der Variable zu tun. Denn wenn ich diese Zeilen ersetze:

for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do (
echo %%G
set apath=%%~G
echo %apath%
)

Ich erhalte das gewünschte Ergebnis: sechs Ausgabepaare dieser Art:

"3D Objects"
3D Objects

wobei die Tilde wie erwartet die Anführungszeichen entfernt.

Im ersten Codebeispiel lässt die Produktion von sieben (nicht sechs) Paaren von Ausgabezeilen darauf schließen, dass die Subroutine die Anführungszeichen ignoriert und "3D" und "Objekte" als zwei separate Elemente darstellt - ein Problem, das indie vorherige Frage.

Ich habe angefangen, an dem Subroutinenansatz herumzubasteln, weil ich mit dem einfacheren Ansatz, der im zweiten Codebeispiel (oben) dargestellt ist, Probleme hatte, ein bestimmtes Ergebnis zu erzielen. Möglicherweise könnte eine verzögerte Erweiterung das Problem beheben, allerdings auf Kosten zusätzlicher Komplexität. Nicht zu leugnen, dass die Zeile „goto :eof“ der Subroutine auch ein wenig verwirrend ist, selbst wenn sie funktioniert.

Meine konkrete Frage ist, was mit der Variable schief läuft, wenn sie in der Subroutine verwendet wird. Aber wenn es einen besseren Weg gibt, würde ich mich auch zumindest über einen Link in diese Richtung freuen.

Antwort1

Sie übergeben den Wert derfürSchleifeniteration zu einem Unterprogramm mitAnrufSie möchten dies (Platzhalter für übergebene Variablen) also in doppelte Anführungszeichen einschließen und dann innerhalb dieser Subroutine auf die übergebene Variable verweisen oder %1die %~1einschließenden doppelten Anführungszeichen entfernen.

Die Verwendung von GOTO :EOFam Ende jeder aufgerufenen Subroutine gibt die Kontrolle an die ursprünglich aufrufende Subroutine zurück, sodass diese gegebenenfalls nach dem callBefehl mit der Verarbeitung ihrer restlichen Logik fortfahren kann.

@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 "%%~G"
goto :eof

:sub1
echo %1
set apath=%~1
echo %apath%
goto :eof
:End

Ausgabe

"3D Objects"
3D Objects
"Documents"
Documents
"Downloads"
Downloads
"Music"
Music
"Pictures"
Pictures
"Videos"
Videos

Unterstützende Ressourcen

  • FÜR
  • Befehlszeilenargumente (Parameter)

    Argumente können auch an eine Subroutine übergeben werden mitCALL:

    CALL :my_sub 2468

    Sie können den Wert jedes Arguments mit einem % gefolgt von seiner numerischen Position in der Befehlszeile abrufen. Das erste übergebene Element ist immer %1, das zweite immer %2und so weiter.

    %*In einem Batch-Skript werden alle Argumente (z. B. %1 %2 %3 %4 %5 ...%255) auf „+“ verwiesen. Nur %1auf Argumente %9kann per Nummer verwiesen werden.

  • ANRUF

    Übergabe per Referenz

    Neben der Übergabe von numerischen oder Zeichenfolgenwerten auf der Kommandozeile ist es auch möglich,VariableName und verwenden Sie dann die Variable, um Daten zwischen Skripten oder Unterprogrammen zu übertragen. Die Übergabe per Referenz ist eine etwas fortgeschrittenere Technik, kann aber besonders nützlich sein, wenn die Zeichenfolge Zeichen enthält, die CMD-Trennzeichen oder Anführungszeichen sind.


    Rufen Sie eine Subroutine auf (:label)

    Der CALLBefehl übergibt die Steuerung an die Anweisung nach dem angegebenen Label sowie an alle angegebenen Parameter.Um das Unterprogramm zu verlassen, geben Sie Folgendes ein: GOTO :eofDie Steuerung wird an das Ende des aktuellen Unterprogramms übertragen..

  • CALL /?

    CALL command now accepts labels as the target of the CALL.  The syntax
    is:
    
        CALL :label arguments
    
    
    In addition, expansion of batch script argument references (%0, %1,
    etc.) have been changed as follows:
    
    
        %* in a batch script refers to all the arguments (e.g. %1 %2 %3
            %4 %5 ...)
    
        Substitution of batch parameters (%n) has been enhanced.  You can
        now use the following optional syntax:
    
            %~1         - expands %1 removing any surrounding quotes (")
    

verwandte Informationen