2014-10-26 3 views
1

в Windows Batch, если бы у меня была переменная (длина может меняться), которая была, например: «hello world!» это можно «разделить» переменная, так что каждый символ является его собственной переменной, так что выход может выглядеть следующим образом:Пакет Windows: Разделить строку на отдельные символы на переменные

t1=h 
t2=e 
t3=l 
etc. 

Любая помощь будет оценена.

+2

Да, это возможно. что ты уже испробовал? – SomethingDark

+2

Есть по крайней мере 3 метода: получить первый символ. и устранить его в цикле 'goto' (медленнее), получить длину строки и использовать цикл' for/L' для доступа к каждому символу. (самый быстрый) и используйте 'cmd/U | find' trick (простейший). – Aacini

ответ

2

Используйте этот код:

setlocal EnableDelayedExpansion 
set str="hello world^!" 
set tempstr=%str% 
set count=0 
:loop 
if defined tempstr (
    set tempstr=%tempstr:~1% 
    set /a count+=1 
    set /a pos=%count%-1 
    set t!count!=!str:~%pos%,1! 
    goto loop 
) 

:: check the generated variables 
set t 

Чтобы получить п-й символ в строке, используйте set char=%str:~n,1%.
Надеюсь, это было полезно!

+0

было бы еще более полезно, если бы вы на самом деле * использовали * замедленное расширение (подсказка: 'count') – Stephan

+0

... или, в' set/A', не используйте '%' и '!': 'Set/a pos = count-1' – aschipfl

1

Вот вариант, используя for /L для перебора всех символов строки. Количество символов, так что длина строки, извлекается в подпрограмму :LENGTH первый:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_STRING=Hello world!" 

call :LENGTH LEN "%_STRING%" 
setlocal EnableDelayedExpansion 
for /L %%I in (0,1,%LEN%) do (
    set "$CHR[%%I]=!_STRING:~%%I,1!" 
) 
set $CHR 
endlocal 

endlocal 
exit /B 


:LENGTH rtn_length val_string 
setlocal DisableDelayedExpansion 
set /A "RET=0" & set "STR=%~2" 
if defined STR set /A "RET=1" 
setlocal EnableDelayedExpansion 
for %%L in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if not "!STR:~%%L,1!"=="" (
     set /A "RET+=%%L" 
     set "STR=!STR:~%%L!" 
    ) 
) 
(
    endlocal 
    endlocal 
    set "%~1=%RET%" 
) 
exit /B 

Вот другой вариант, используя cmd /U, чтобы преобразовать строку в Unicode, где нуль- байт becomers вставлено позади каждого символа, и find, который обрабатывает эти нулевые байты, как отслуживших линии маркеров:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_STRING=Hello world!" 

set /A "IDX=0" 
for /F delims^=^ eol^= %%I in (' 
    cmd /U /V /C echo^(!_STRING!^| find /V "" 
') do (
    set "CHR=%%I" 
    setlocal EnableDelayedExpansion 
    for /F "delims=" %%J in ("$CHR[!IDX!]=!CHR!") do (
     endlocal 
     set "%%J" 
    ) 
    set /A "IDX+=1" 
) 
set $CHR 

endlocal 
exit /B 

Наконец, здесь Аноф er, основанный на петле goto. Это использует указатель позиции POS для сканирования строки и для извлечения одного символа. Если символ не возвращается, конец строки достигнут:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_STRING=Hello world!" 

setlocal EnableDelayedExpansion 
if not defined _STRING goto :QUIT 
set /A "POS=0" 
:LOOP 
set "CHR=!_STRING:~%POS%,1!" 
if defined CHR (
    set "$CHR[%POS%]=!CHR!" 
    set /A "POS+=1" 
    goto :LOOP 
) 
:QUIT 
set $CHR 
endlocal 

endlocal 
exit /B 
Смежные вопросы