Was bedeutet die Tilde ~ in Batchvariablen?

Was bedeutet die Tilde ~ in Batchvariablen?

Ich weiß von call /?, dass die ~in-Variable (z. B. %~d1) verwendet wird, um einen Teil des Dateipfads (hier Treiber) zu analysieren, aber die Tilde wird hier in einem anderen Kontext verwendet:https://www.tutorialspoint.com/batch_script/batch_script_string_length.htm:

@echo off
set str = Hello World
call :strLen str strlen
echo String is %strlen% characters long
exit /b

:strLen
setlocal enabledelayedexpansion

:strLen_Loop
   if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof

Was bedeutet diese Variablenerweiterung hier: "!%1:~%len%!"? Und wie berechnet sie die Länge der Zeichenfolge durch Vergleich mit einer leeren Zeichenfolge? Was ist hier der Zweck der Tilde? Außerdem bringt mich dieses Beispiel in eine Endlosschleife, wo die Ausgabe ist if not "!str:~136!" == "" set /A len+=1 & goto :strLen_Loop(wo die Zahl !str:~nwächst).

Antwort1

Das Tilde-Zeichen (~) wird in Batchdateien auf unterschiedliche Weise verwendet:

  • Entfernen von Anführungszeichen bei Argumenten. Ein Tilde-Zeichen vor einem Befehlszeilenargument (wie „%~1“) gibt an, dass die umgebenden Anführungszeichen aus dem Parameter entfernt werden sollen. Wenn der Wert für %1 beispielsweise „Hi“ ist, wird %~1 nur zu Hi erweitert.

  • Teilstring-Verarbeitung. Es gibt eine Möglichkeit, Teilstrings aus einer String-Variable in einer Batch-Datei zu extrahieren. Die Syntax lautet: %variable:~num_chars_skip,num_chars_keep%. „Anzahl zu überspringende Zeichen“ bedeutet, wo im String begonnen werden soll oder wie viele Zeichen vor der String-Variable ausgeschlossen werden sollen. Und „Anzahl zu behaltende Zeichen“ gibt die Anzahl der Zeichen nach dem Startpunkt an. „Anzahl zu behaltende Zeichen“ ist optional, aber die erste Angabe ist obligatorisch. Wenn „Anzahl zu behaltende Zeichen“ nicht angegeben ist, wird nur das „Anzahl zu behaltende Zeichen“-te Zeichen analysiert.

Für weitere Hilfe sollten Sie Folgendes in der Eingabeaufforderung lesen:

  • call /?
  • for /?
  • set /?

Ich hoffe, das hilft

Antwort2

Versuchen set /?:

...
Die Ersetzung von Umgebungsvariablen wurde wie folgt verbessert:

%PATH:str1=str2%

würde die Umgebungsvariable PATH erweitern und jedes Vorkommen von „str1“ im erweiterten Ergebnis durch „str2“ ersetzen. „str2“ kann die leere Zeichenfolge sein, um alle Vorkommen von „str1“ effektiv aus der erweiterten Ausgabe zu löschen. „str1“ kann mit einem Sternchen beginnen. In diesem Fall entspricht es allem vom Anfang der erweiterten Ausgabe bis zum ersten Vorkommen des verbleibenden Teils von str1.

Kann auch Teilzeichenfolgen für eine Erweiterung angeben.

%PATH:~10,5%

würde die Umgebungsvariable PATH erweitern und dann nur die 5 Zeichen verwenden, die beim 11. Zeichen (Offset 10) des erweiterten Ergebnisses beginnen. Wenn die Länge nicht angegeben ist, wird standardmäßig der Rest des Variablenwerts verwendet. Wenn eine der Zahlen (Offset oder Länge) negativ ist, wird die Länge des Umgebungsvariablenwerts verwendet, der zum angegebenen Offset oder zur angegebenen Länge addiert wird.

%PATH:~-10%

würde die letzten 10 Zeichen der PATH-Variable extrahieren.

%PATH:~0,-2%

würde alle Zeichen außer den letzten beiden der PATH-Variable extrahieren.

DerVerhaltenist sehr nützlich, aber dieBeschreibungüber negative Zahlen ist sowohl verwirrend als auch ungenau. Es ist richtig für die erste Zahl (den Offset): %VAR:~N%beginnt am Ende Minuszeichen N. Bei Verwendung einer negativen Zahl für diezweiteNummer, es ist nicht mehr die TeilzeichenfolgeLänge, sondern interpretiert als die Anzahl der Zeichen, die vor dem Ende desWert, unabhängig von seiner Länge. %VAR:~1,-1%Gibt also den Wert mit Ausnahme des ersten und letzten Zeichens an, und sowohl als auch %VAR:~-2,-1%geben %VAR:~-2,1%das vorletzte Zeichen an.

Antwort3

  • Um den Code dieses Tutorials zu „korrigieren“ und eine Endlosschleife zu verhindern, wird im Kommentar Folgendes zitiert:

Ich verstehe, aber auf meinem Computer muss ich ^C drücken, um es zu beenden. Sehen Sie sich nur an, wie groß die Zahl ist - 136 - obwohl es keine Länge oder kein Wort mit 136 Zeichen gibt- @Hirt

@echo off && setlocal enabledelayedexpansion

set "_str=Hello World" & call :strLen_Loop str

:strLen_Loop
if "%~1" == "" ( 
      endlocal & goto :EOF
    ) else if not "!_%~1:~%_len%!" == "" (
      set /A "_len+=1" & goto=:strLen_Loop
    ) else echo\String is !_len! characters long & exit /b

verwandte Informationen