header-xh-01 header-xh-02 header-xh-03 header-xh-04 header-xh-05 header-xh-06 header-xh-07 header-xh-08 header-xh-09 header-xh-10 header-xh-11 header-xh-12 header-xh-13 header-xh-14
Lembach's nichtkommerzielle Website rund um CMSimple_XH
Templates, Plugins, Tools, Programme
und Tips und Tricks die mir wichtig sind
Letzte Bearbeitung:

Batch-Programmschnipsel

How-to: Extract part of a variable (substring)

(Quelle: https://ss64.com/nt/syntax-substring.html)

Es ist möglich, bestimmte Zeichen aus einer String-Variablen zu entnehmen.

Syntax
      %variable:~start_index%
      %variable:~start_index,end_index%

Dies kann auch negative Zahlen einschließen:

      %variable:~start_index, -end_index%
      %variable:~-start_index,end_index%
      %variable:~-start_index,-end_index%
start_index Legt den Startpunkt für die zurückgegebene Zeichenkette fest (beginnend bei 0!); bei positiven Zahlen ist dies die Anzahl der übersprungenen Zeichen.
Bei einer negativen Zahl wird vom Ende der Zeichenkette aus rückwärts gezählt.

end_index Legt den Endpunkt für die zurückgegebene Zeichenkette fest; bei positiven Zahlen ist dies die Anzahl der Zeichen, die nach dem start_index zurückgegeben werden.
Bei einer negativen Zahl wird vom Ende der Zeichenkette aus rückwärts gezählt.

Diese Syntax bietet im Vergleich zu einer Standard-Mid()-Funktion ein wenig mehr Flexibilität, die am besten durch die folgenden Beispiele veranschaulicht wird.

Examples

Die Variable _test wird für alle folgenden Beispiele verwendet:

SET _test=123456789abcdef0

::Nur die ersten 5 Zeichen extrahieren

 SET _result=%_test:~0,5%
 ECHO %_result%          =12345

::Überspringe 7 Zeichen und extrahiere dann die nächsten 5

 SET _result=%_test:~7,5%
 ECHO %_result%          =89abc

::7 Zeichen überspringen und dann alles andere extrahieren

 SET _result=%_test:~7%
 ECHO %_result%          =89abcdef0

::Nur die letzten 7 Zeichen extrahieren

 SET _result=%_test:~-7%
 ECHO %_result%          =abcdef0

::Alles außer den letzten 7 Zeichen extrahieren

 SET _result=%_test:~0,-7%
 ECHO %_result%          =123456789

::Auszug zwischen 7 von vorne und 5 von hinten

 SET _result=%_test:~7,-5%
 ECHO %_result%          =89ab

::Gehen Sie 7 vom Ende zurück und ziehen Sie dann 5 zum Ende hin heraus.

 SET _result=%_test:~-7,5%
 ECHO %_result%          =abcde

::Auszug zwischen 7 vor dem Ende und 5 vor dem Ende

   SET _result=%_test:~-7,-5%
   ECHO %_result%        =ab

Diese Variablen-Substring-Syntax funktioniert nur für CMD-Umgebungsvariablen wie %MYVAR%, sie funktioniert nicht mit FOR-Parameter-Variablen wie %%G. Eine einfache Umgehung besteht darin, zuerst eine Variable zu setzen: Setzen Sie %MYVAR%=%%G und suchen Sie dann den Substring der neuen Variable.

Wenn Sie innerhalb einer FOR-Schleife auf den aktuellen Wert einer Variablen zugreifen müssen, müssen Sie möglicherweise eine verzögerte Expansion (delayed expansion) verwenden. Standardmäßig erfolgt die Variablenexpansion nur einmal am Anfang jeder Schleife.

Erweiterte Verwendung von :~

Sie können die :~-Syntax verwenden und jeden der Parameter aus anderen Variablen bereitstellen, zum Beispiel wenn Sie

%_donor%=2539850
%_digit%=4

Um die 4. Ziffer aus _donor zu extrahieren, können Sie versuchen

SET _substring=%_donor:~%_digit%,1%

Leider wird dies nicht funktionieren, da die :~-Syntax einen Wert und keine Variable erwartet. Um dies zu umgehen, verwenden Sie den CALL-Befehl wie folgt:

SET _startchar=2
SET _length=1
SET _donor=884777
CALL SET _substring=%%_donor:~%_startchar%,%_length%%%
ECHO (%_substring%) 
:: Credits:
:: Clay Calvert - alt.msdos.batch.nt
:: Ritchie Lawrence - alt.msdos.batch.nt

#Substitute Me for him, Substitute My Coke for gin, Substitute You for my mum, At least I'll get my washing done# ~ The Who (Substitute)

Verwandte Befehle:

How-to: VarSearch - Search & replace part of a variable.
How-to: strlen.cmd - Get string length.
PowerShell equivalent: Substring() - Return part of a longer string.


Variablen ähnlich einem Array verwenden

Wenn man Variablen hatt, die eine fortlaufende Nummer (ähnlich einem Index in einer Feldvariablen) haben, kamm man diese in einem Iterationslauf auch so ähnlich wie eine Feldvariable ansprechen:

Quelle: https://superuser.com/questions/1456251/batch-dynamically-change-variable-name

Beitrag unter Y und folgende

Bei einer Eingabedatei, die wie folgt aussieht

rep1=Die
url1=schnell
rep2=braun
url2=Fuchs
  ︙

Sie wollen die Datei lesen, die Variablen rep1=The, url1=quick, rep2=brown, url2=fox, etc... in der Umgebung setzen und dann eine Schleife durch diese Umgebungsvariablen ziehen und Befehle ausführen wie

program.exe -param1 Die -installIU quick
programm.exe -param1 braun -installIU fox
    ︙

Hier ist eine Möglichkeit, das zu tun:

Set /a _Lines=0
For /f %%j in ('Find "" /v /c ^< %_File%') Do Set /a _Lines=%%j
::counting how many times for loop to go
set /a iterate=(%_Lines%-0)/2
::read the ini file
for /f "delims=" %%a in (list.ini) do set %%a
  
setlocal enableextensions enabledelayedexpansion
FOR /L %%I IN (1,1,%iterate%) DO (
    set count=%%I
    call set "rep=%%rep!count!%%"
    call set "url=%%url!count!%%"
    program.exe -param1 "!rep!" -installIU "!url!"
)

... Anmerkungen:

  • Wahrscheinlich brauchen Sie Set /a _Lines=0 nicht auszuführen (d.h. Sie können diese Zeile wahrscheinlich einfach weglassen).
  • Sie sollten überprüfen, ob _Lines nach dem Befehl For ... ('Find ...) ... einen gültigen Wert hat.  Um wirklich paranoid zu sein, könnten Sie _Lines mit einem völlig ungültigen Wert initialisieren (wie none oder null).  Wenn _Lines nach dem Befehl For ... ('Find ...) ... immer noch der Anfangswert ist, bedeutet das, dass der Befehl fehlgeschlagen ist.
    Wenn _Lines etwas anderes als eine gerade, positive ganze Zahl ist, dann stimmt etwas nicht.
    • Wenn _Lines 0 (Null) oder eine ungerade, positive ganze Zahl ist, dann stimmt etwas mit Ihrer Datei nicht.
    • Wenn _Lines etwas anderes ist (eine negative Zahl, eine Nicht-Ganzzahl wie 3.14 oder eine Nicht-Zahl wie foo), dann stimmt etwas mit dem Find-Befehl nicht.
  • Ich habe iterate auf (%_Lines%-0)/2 gesetzt, um deutlich zu machen, dass ich eine Änderung vorgenommen habe.  Ich glaube, Sie sollten einfach set /a iterate=%_Lines%/2 nehmen können.  
    Denn wenn die Datei 42 Zeilen lang ist, dann haben Sie 21 Datenpunkte (d. h. 21 Wertepaare, die 21 Befehlsausführungen erfordern), richtig?
    Wenn Sie einen guten Grund für die Subtraktion eines Wertes haben, fügen Sie die -1 wieder ein (aber Sie sollten den Grund dokumentieren, wenn auch nur als Kommentar in Ihrem Code).
  • Ich habe enableextensions drin gelassen, weil Sie es hatten, aber soweit ich weiß, brauchen Sie es nicht.
  • Da es sich um eine FOR /L-Schleife handelt, brauchen wir auch nicht mit einer Zählvariablen zu rechnen; setzen Sie sie einfach gleich dem Schleifenindex.
  • Schließlich die Ausgabe:

    call set "rep=%%rep!count!%%"
    Aufruf von "url=%%url!count!%%"


    Wenn count (z.B.) 17 ist, dann wird der erste Befehl eine Zeichenkette erstellen, die wie "rep=%rep17%" aussieht.  
    Wir "rufen" dann den Befehl set "rep=%rep17%" auf, der diesen Befehl neu analysiert/interpretiert/auswertet und rep gleich dem Wert von %rep17% setzt.  (Natürlich macht die zweite Zeile genau das Gleiche für url.)

    Die Idee für diese Art der Verwendung der Aufrufanweisung stammt aus Squashmans Antwort auf Batch Increment Variable String.  Variationen werden in anderen Threads diskutiert, z.B. Batch file. Variable in Variable (obwohl nicht alle Antworten auf diese Frage in Schleifen funktionieren).

*** Übersetzt mit www.DeepL.com/Translator (kostenlose Version) ***

 

Yikes! schreibt in etwa

Gegeben sei eine Variablenreihe wie diese:

rep1=The
url1=quick
rep2=brown
url2=fox
  ︙

Daraus kann man dann dies machen:

setlocal enabledelayedexpansion
FOR /L %%I IN (1,1,%iterate%) DO (
    call set "rep=%%rep%%I%%"
    call set "url=%%url%%I%%"
    program.exe -param1 "!rep!" -installIU "!url!"
)

Der kryptische Ausdruck %%rep%%I%% wird wie folgt geparst:

%%rep%%I%%
▲▲   ↑-↑▲▲
▲▲______▲▲

  • Zunächst wird das %%I als Schleifenindexvariable erkannt und durch seinen Wert (z. B. 17) ersetzt, was zu einer Zeichenfolge wie %%rep17%% führt.
  • Die verbleibenden %%-Paare werden auf einzelne %-Zeichen reduziert: %rep17%.
  • Der Ausdruck %rep17% wird als die 17. rep-Variable interpretiert.


Beachten Sie, dass diese Lösung auch die Verwendung einer Zählvariablen vermeidet.


Bearbeiten / Ersetzen von Text innerhalb einer Variablen

Quelle: https://ss64.com/nt/syntax-replace.html

....

Die obigen Beispiele gehen von der Standard-Expansion von Variablen aus. Wenn Sie DelayedExpansion verwenden, können Sie Variablen innerhalb einer einzelnen Schleife/Ausdruck ändern. Verwenden Sie die Syntax: !_variable! anstelle von %_variable%

Umbenennen einer Reihe von Dateien (fred001.txt - fred999.txt) mit einem anderen Präfix; dies ist ähnlich, aber flexibler als eine Umbenennung mit Platzhaltern,
via Raymond Chen
Setlocal EnableDelayedExpansion
for %%i in (fred*.txt) do set "_=%%i" & ren "%%i" "!_:fred=wilma!"

Ein weiterer Vorteil von DelayedExpansion ist, dass es Ihnen erlaubt, das %-Zeichen zu ersetzen. Es muss immer noch als %% escaped werden, aber die Ersetzungsaktion wird es dann wie jedes andere Zeichen behandeln:

Replace the letter P with a percent symbol:
Setlocal EnableDelayedExpansion
_demo=somePdemoPtextP
_demo=!_demo:P=%%!

....


Delayed Variable Expansion - Verzögerte Variablen Erweiterung

Quelle: https://www.robvanderwoude.com/ntset.php

....
Die verzögerte Expansion von Umgebungsvariablen ist nützlich, um die Beschränkungen der aktuellen Expansion zu umgehen, die stattfindet, wenn eine Textzeile gelesen wird, nicht wenn sie ausgeführt wird.
Das folgende Beispiel veranschaulicht das Problem der sofortigen Variablenexpansion:

SET VAR=before
IF "%VAR%" == "before" (
    SET VAR=after;
    IF "%VAR%" == "after" @ECHO If you see this, it worked
)
würde niemals die Meldung anzeigen, da die %VAR% in BEIDEN IF-Anweisungen ersetzt werden, wenn die erste IF-Anweisung gelesen wird, da sie logischerweise den Körper der IF-Anweisung enthält, die eine zusammengesetzte Anweisung ist.
Die IF-Anweisung innerhalb der zusammengesetzten Anweisung vergleicht also in Wirklichkeit "before" mit "after", was niemals gleich sein wird.
Auch das folgende Beispiel wird nicht wie erwartet funktionieren:

SET LIST=
FOR %A IN (*) DO SET LIST=%LIST% %A
ECHO %LIST%
indem es NICHT eine Liste der Dateien im aktuellen Verzeichnis aufbaut, sondern stattdessen die Variable LIST auf die letzte gefundene Datei setzt.
Das liegt wiederum daran, dass die Variable %LIST% nur einmal erweitert wird, wenn die FOR-Anweisung gelesen wird, und zu diesem Zeitpunkt ist die Variable LIST leer.
Die eigentliche FOR-Schleife, die wir ausführen, lautet also:

FOR %A IN (*) DO SET LIST= %A

die LIST einfach auf die zuletzt gefundene Datei setzt.

Die verzögerte Erweiterung von Umgebungsvariablen ermöglicht es Ihnen, ein anderes Zeichen (das Ausrufezeichen) zu verwenden, um Umgebungsvariablen zur Ausführungszeit zu erweitern.
Wenn die verzögerte Variablenexpansion aktiviert ist, könnten die obigen Beispiele wie folgt geschrieben werden, um wie vorgesehen zu funktionieren:

SET VAR=before
IF "%VAR%" == "before" (
    SET VAR=after
    IF "!VAR!" == "after" @ECHO If you see this, it worked
)

SET LIST=
FOR %A IN (*) DO SET LIST=!LIST! %A
ECHO %LIST%


 


| Seitenanfang |