Angenommen, ich habe eine Zeichenfolge "AAA BBB CCC DDD EEE FFF".
Wie kann ich den String in einer Batchdatei aufteilen und den n-ten Teilstring abrufen?
Das Äquivalent in C # wäre
"AAA BBB CCC DDD EEE FFF".Split()[n]
siehe HELP FOR
und die Beispiele
oder versuchen Sie es einfach
for /F %%a in ("AAA BBB CCC DDD EEE FFF") do echo %%c
Drei mögliche Lösungen zum Durchlaufen der Wörter der Zeichenfolge:
Version 1:
@echo off & setlocal
set s=AAA BBB CCC DDD EEE FFF
for %%a in (%s%) do echo %%a
Version 2:
@echo off & setlocal
set s=AAA BBB CCC DDD EEE FFF
set t=%s%
:loop
for /f "tokens=1*" %%a in ("%t%") do (
echo %%a
set t=%%b
)
if defined t goto :loop
Version 3:
@echo off & setlocal
set s=AAA BBB CCC DDD EEE FFF
call :sub1 %s%
exit /b
:sub1
if "%1"=="" exit /b
echo %1
shift
goto :sub1
Version 1 funktioniert nicht, wenn die Zeichenfolge Platzhalterzeichen wie '*' oder '?' Enthält.
Die Versionen 1 und 3 behandeln Zeichen wie '=', ';' oder ',' als Word-Trennzeichen. Diese Zeichen haben die gleiche Wirkung wie das Leerzeichen.
Dies ist der einzige Code, der für mich funktioniert hat:
for /f "tokens=4" %%G IN ("aaa bbb ccc ddd eee fff") DO echo %%G
ausgabe:
ddd
Der folgende Code teilt eine Zeichenfolge mit einer beliebigen Anzahl von Teilzeichenfolgen auf:
@echo off
setlocal ENABLEDELAYEDEXPANSION
REM Set a string with an arbitrary number of substrings separated by semi colons
set teststring=The;rain;in;spain
REM Do something with each substring
:stringLOOP
REM Stop when the string is empty
if "!teststring!" EQU "" goto END
for /f "delims=;" %%a in ("!teststring!") do set substring=%%a
REM Do something with the substring -
REM we just echo it for the purposes of demo
echo !substring!
REM Now strip off the leading substring
:striploop
set stripchar=!teststring:~0,1!
set teststring=!teststring:~1!
if "!teststring!" EQU "" goto stringloop
if "!stripchar!" NEQ ";" goto striploop
goto stringloop
)
:END
endlocal
einfach
batchdatei:
FOR %%A IN (1 2 3) DO ECHO %%A
befehlszeile:
FOR %A IN (1 2 3) DO ECHO %A
ausgabe:
1
2
3
Mit dem folgenden Code wird eine Zeichenfolge mit N Anzahl von Teilzeichenfolgen mit durch # getrennten Werten aufgeteilt. Sie können ein beliebiges Trennzeichen verwenden
@echo off
if "%1" == "" goto error1
set _myvar="%1"
:FORLOOP
For /F "tokens=1* delims=#" %%A IN (%_myvar%) DO (
echo %%A
set _myvar="%%B"
if NOT "%_myvar%"=="" goto FORLOOP
)
goto endofprogram
:error1
echo You must provide Argument with # separated
goto endofprogram
:endofprogram
oder Powershell für ein indiziertes 0-Array.
PS C:\> "AAA BBB CCC DDD EEE FFF".Split()
AAA
BBB
CCC
DDD
EEE
FFF
PS C:\> ("AAA BBB CCC DDD EEE FFF".Split())[0]
AAA
@echo off
:: read a file line by line
for /F %%i in ('type data.csv') do (
echo %%i
:: and we extract four tokens, ; is the delimiter.
for /f "tokens=1,2,3,4 delims=;" %%a in ("%%i") do (
set first=%%a&set second=%%b&set third=%%c&set fourth=%%d
echo %first% and %second% and %third% and %fourth%
)
)
Ich endete mit folgendem:
set input=AAA BBB CCC DDD EEE FFF
set nth=4
for /F "tokens=%nth% delims= " %%a in ("%input%") do set nthstring=%%a
echo %nthstring%
Hiermit können Sie die Eingabe und den Index parametrieren. Stellen Sie sicher, dass Sie diesen Code in eine Bat-Datei einfügen.
Hier ist eine Lösung basierend auf einer " function ", die jedes Zeichen verarbeitet, bis es das Trennzeichen findet.
Es ist relativ langsam, aber es ist zumindest keine Denkaufgabe (außer für den Funktionsteil).
:: Example #1:
set data=aa bb cc
echo Splitting off from "%data%":
call :split_once "%data%" " " "left" "right"
echo Split off: %left%
echo Remaining: %right%
echo.
:: Example #2:
echo List of paths in PATH env var:
set paths=%PATH%
:loop
call :split_once "%paths%" ";" "left" "paths"
if "%left%" equ "" goto loop_end
echo %left%
goto loop
:loop_end
:: HERE BE FUNCTIONS
goto :eof
:: USAGE:
:: call :split_once "string to split once" "delimiter_char" "left_var" "right_var"
:split_once
setlocal
set right=%~1
set delimiter_char=%~2
set left=
if "%right%" equ "" goto split_once_done
:split_once_loop
if "%right:~0,1%" equ "%delimiter_char%" set right=%right:~1%&& goto split_once_done
if "%right:~0,1%" neq "%delimiter_char%" set left=%left%%right:~0,1%
if "%right:~0,1%" neq "%delimiter_char%" set right=%right:~1%
if "%right%" equ "" goto split_once_done
goto split_once_loop
:split_once_done
endlocal & set %~3=%left%& set %~4=%right%
goto:eof
set a=AAA BBB CCC DDD EEE FFF
set a=%a:~6,1%
Dieser Code findet das fünfte Zeichen in der Zeichenfolge. Wenn ich die neunte Zeichenkette finden wollte, würde ich die 6 durch 10 ersetzen (eine hinzufügen).
Das funktioniert für mich (nur ein Auszug aus meinem ganzen Skript)
choice /C 1234567H /M "Select an option or ctrl+C to cancel"
set _dpi=%ERRORLEVEL%
if "%_dpi%" == "8" call :helpme && goto menu
for /F "tokens=%_dpi%,*" %%1 in ("032 060 064 096 0C8 0FA 12C") do set _dpi=%%1
echo _dpi:%_dpi%:
UPDATE: Nun, anfangs habe ich die Lösung für ein schwierigeres Problem veröffentlicht, um eine vollständige Aufteilung einer beliebigen Zeichenfolge mit einem Trennzeichen (nur delims) zu ändern. Ich habe mehr als die vom OP gewünschten Lösungen gelesen, sorry. Ich denke, ich halte mich diesmal an die ursprünglichen Anforderungen:
@echo off
IF [%1] EQU [] echo get n ["user_string"] & goto :eof
set token=%1
set /a "token+=1"
set string=
IF [%2] NEQ [] set string=%2
IF [%2] EQU [] set string="AAA BBB CCC DDD EEE FFF"
FOR /F "tokens=%TOKEN%" %%G IN (%string%) DO echo %%~G
Eine andere Version mit einer besseren Benutzeroberfläche:
@echo off
IF [%1] EQU [] echo USAGE: get ["user_string"] n & goto :eof
IF [%2] NEQ [] set string=%1 & set token=%2 & goto update_token
set string="AAA BBB CCC DDD EEE FFF"
set token=%1
:update_token
set /a "token+=1"
FOR /F "tokens=%TOKEN%" %%G IN (%string%) DO echo %%~G
Ausgabebeispiele:
E:\utils\bat>get
USAGE: get ["user_string"] n
E:\utils\bat>get 5
FFF
E:\utils\bat>get 6
E:\utils\bat>get "Hello World" 1
World
Dies ist eine Batchdatei, um die Verzeichnisse des Pfads zu teilen:
@echo off
set string="%PATH%"
:loop
FOR /F "tokens=1* delims=;" %%G IN (%string%) DO (
for /f "tokens=*" %%g in ("%%G") do echo %%g
set string="%%H"
)
if %string% NEQ "" goto :loop
2. Version:
@echo off
set string="%PATH%"
:loop
FOR /F "tokens=1* delims=;" %%G IN (%string%) DO set line="%%G" & echo %line:"=% & set string="%%H"
if %string% NEQ "" goto :loop
3. Version:
@echo off
set string="%PATH%"
:loop
FOR /F "tokens=1* delims=;" %%G IN (%string%) DO CALL :sub "%%G" "%%H"
if %string% NEQ "" goto :loop
goto :eof
:sub
set line=%1
echo %line:"=%
set string=%2
sie können vbscript anstelle von batch (cmd.exe) verwenden.
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
str1 = objArgs(0)
s=Split(str1," ")
For i=LBound(s) To UBound(s)
WScript.Echo s(i)
WScript.Echo s(9) ' get the 10th element
Next
verwendungszweck:
c:\test> cscript /nologo test.vbs "AAA BBB CCC"
Versuche dies :
for /F "tokens=1,2" %%a in ("hello how are you") do echo %%a %%b
Beachten :
"tokens"
bestimmt Teilwörter, ich meine, Sie können zum Beispiel Folgendes verwenden:
"tokens=1,2"
Zeigt 2
Wörter von main string an. Natürlich sollten Sie echo %%a %%b
gegenseitig verwenden.
Die Ausgabe wird also sein:
hello how
Wenn jemand eine Zeichenfolge mit einem Trennzeichen teilen und Werte in separaten Variablen speichern muss, ist hier das Skript, das ich erstellt habe.
FOR /F "tokens=1,2 delims=x" %i in ("1920x1080") do (
set w=%i
set h=%j
)
echo %w%
echo %h%
Erläuterung: 'Token' definiert, welche Elemente Sie an den Hauptteil von FOR übergeben müssen, wobei das Token durch das Zeichen 'x' begrenzt wird. Nach der Abgrenzung werden das erste und das zweite Token an den Körper übergeben. Im Hauptteil bezieht sich% i auf das erste Token und% j auf das zweite Token. Wir können% k nehmen, um auf das 3. Token zu verweisen und so weiter.
Bitte geben Sie auch HELP FOR in cmd ein, um eine detaillierte Erklärung zu erhalten.