如何在 CMD/Batch 中将数字拆分为单个数字

How to split a number into individual digits in CMD/Batch

我想将数字拆分成单独的数字,并使用 Windows 上的 cmd/batch 将它们存储到变量中。例如,数字“38”应在 VAR1 中存储为“3”,在 VAR2 中存储为“8”。

这是我目前对这个问题的看法:

@echo off
SET NUMBER=38
FOR /F "TOKENS=1,2 delims=0123456789" %%A IN ("%NUMBER%") DO (CALL :VARSET %%A %%B)
ECHO %NUMBER% has the fallowing digits:
ECHO 1st digit: %VAR1%
ECHO 2nd digit: %VAR2%
PAUSE
EXIT /B 0

:VARSET
set VAR1=%1
set VAR2=%2
GOTO:EOF

我希望输出为:

ECHO 38 has the fallowing digits:
ECHO 1st digit: 3
ECHO 2nd digit: 8

但我得到:

ECHO 38 has the fallowing digits:
ECHO 1st digit: Echo is off.
ECHO 2nd digit: Echo is off.

问题似乎是我使用“0123456789”作为分隔符。也许这根本无法使用 FOR 循环?

编辑:错别字

用简单的数学运算 - 我建议您从最低有效数字开始,以便能够轻松地重建值。

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
:Again
set "#=" & Set Place=0
Set /p "#=Enter # :"
if "%#%" equ "" goto :Eof
Set /A Test=#
:Loop
Set /A "Place+=1,#[!Place!]=Test %% 10,Test/=10"
If "%Test%" gtr "0" goto :Loop
Set #
Echo =====
For /f "delims==" %%A in ('Set #') Do set "%%A="
Goto :Again

样本运行:

Enter # :123456789
#=123456789
#[0]=9
#[1]=8
#[2]=7
#[3]=6
#[4]=5
#[5]=4
#[6]=3
#[7]=2
#[8]=1
=====
Enter # :

编辑:在我发布我的之前没有看到 LotPings 的回答。谢谢你的回答,效果也不错。

@Jeff Zeitlin 对于 link 和 aschipfl 对于 'lesson' :) 一个非常简单的解决方案是:

@echo off
SET NUMBER=38
SET VAR1=%NUMBER:~0,1%
SET VAR2=%NUMBER:~1,2%
ECHO %NUMBER% has the following digits:
ECHO 1st digit: %VAR1%
ECHO 2nd digit: %VAR2%
PAUSE
EXIT /B 0

也许更可重用的方法是:

@ECHO OFF
SET COUNT=0
SET NUMBER=1234567890
CALL :SPLITNUM %NUMBER%
PAUSE
EXIT /b 0

:SPLITNUM
SETLOCAL ENABLEDELAYEDEXPANSION
SET NUMBER=%1
:LOOP
SET /A COUNT+=1
SET VAR%COUNT%=%NUMBER:~0,1%
ECHO VAR%COUNT% is !VAR%COUNT%!
SET NUMBER=%NUMBER:~1%
IF NOT "%NUMBER%"=="" (GOTO:LOOP)
ENDLOCAL
GOTO:EOF

只是为了它:

@Echo Off
SetLocal EnableDelayedExpansion
Set "i=0"
For /F Delims^=^ EOL^= %%A In ('"CMD/U/CEcho %*|Find /V """') Do (Set/A i+=1
    Set "Var[!i!]=%%A")
Set Var[
Timeout -1

只是 运行 就像 file.cmd 5678 其中 file.cmd 是这个脚本的保存名称和 5678 一个字母数字字符串拆分成单独的变量。

更简单、更快捷。只需在for /L命令中输入最大位数:

@echo off
setlocal EnableDelayedExpansion

set NUMBER=%1
echo %NUMBER% has the following digits:

for /L %%i in (1,1,12) do if defined NUMBER (
   set "VAR[%%i]=!NUMBER:~0,1!"
   set "NUMBER=!NUMBER:~1!"
)

set VAR[