【问题标题】:Windows Batch: Split String to individual characters to variablesWindows Batch:将字符串拆分为单个字符到变量
【发布时间】:2014-10-26 19:20:41
【问题描述】:

在 Windows Batch 中,如果我有一个变量(长度可以更改),例如:“hello world!” 是否可以“拆分”变量,使每个字符都是自己的变量,因此输出可能如下所示:

t1=h
t2=e
t3=l
etc.

任何帮助将不胜感激。

【问题讨论】:

  • 是的,有可能。到目前为止,您尝试过什么?
  • 至少有3种方法:获取第一个字符。并在goto 循环中消除它(最慢),获取字符串长度并使用for /L 循环访问每个字符。 (最快),并使用cmd /U | find 技巧(最简单)。

标签: windows string variables batch-file


【解决方案1】:

使用此代码:

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

要获取字符串中的第 n 个字符,请使用 set char=%str:~n,1%
我希望这会有所帮助!

【讨论】:

  • 会更有帮助,如果你真的使用延迟扩展(提示:count
  • ...或者,在set /A内,既不使用%也不使用!set /a pos=count-1
【解决方案2】:

这是一个使用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,其中在每个字符后面插入一个空字节成为,而 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

最后,这是另一个基于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

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2015-08-17
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多