web-dev-qa-db-de.com

Wie teilt man eine Zeichenfolge in einer Windows-Batchdatei nach Leerzeichen auf?

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]
51
Cheeso

siehe HELP FOR und die Beispiele

oder versuchen Sie es einfach

 for /F %%a in ("AAA BBB CCC DDD EEE FFF") do echo %%c
28
PA.

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.

33

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
26
Scott E

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
14
Dave

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
7
capdragon

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
3
user2637808

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
2
ecciethetechie
@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% 
    )
)
2
Pello X

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.

2
Bruno

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
1
blackwell
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).

1
Jon

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%:
0
gonzalezea

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
0
carlos_lm

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"
0
ghostdog74

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
0

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.

0
p_champ