Вот вариант, используя 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
Да, это возможно. что ты уже испробовал? – SomethingDark
Есть по крайней мере 3 метода: получить первый символ. и устранить его в цикле 'goto' (медленнее), получить длину строки и использовать цикл' for/L' для доступа к каждому символу. (самый быстрый) и используйте 'cmd/U | find' trick (простейший). – Aacini