【问题标题】:How to make batch read certain parts of text and convert it into a variable如何批量读取文本的某些部分并将其转换为变量
【发布时间】:2020-11-11 05:28:13
【问题描述】:

所以我只是想知道是否可以让批处理文件读取一行文本,但将每个字母拆分成它自己的变量,例如:

@echo off
:start
set /p text=input:
set out=
set out2= 
set /p text=input: 

:loop
set out=%out% %text:~0,1%
set out2=%out2:~1% %text:~1%
set text=%text:~1%
if defined text goto loop
echo %out% -%out2%
pause
goto start

我在这里写的东西不起作用(我只是在摆弄试图找到答案) 但我试图做的是将“out”和“out2”变成 2 个单独的值。其中“out”是输入的第一个字母,“out2”是第二个字母,依此类推。 (计划有大约 16 个输出可以读取用户输入的任何内容的前 16 个字母并将其转换为单独的变量)

例如:在同一行中输入“ab”将导致“out”为“a”而“out2”为 b

我也想不通的另一件事是如何阻止“退出”阅读第一个字母之后的所有内容。如果有人可以帮助我解决此问题,请说明您为解决该问题所做的工作。提前致谢

【问题讨论】:

  • 关于您的最后一段:set "out=%text:~0,1%" 从输入文本中提取第一个字符(位置索引0,以及1 字符的长度)...

标签: windows batch-file variables cmd


【解决方案1】:

这里有一个小技巧,您可以使用 CMD.exe 和 /U 选项。 FOR /F 命令是捕获输出以分配给变量所必需的。然后我用cnt 变量构建一个伪数组。 SET out 命令只是用来显示伪数组中的所有变量。

@echo off
setlocal
SET /P "text=INPUT:"
set "cnt=0"
for /F "delims=" %%G IN ('cmd /u /c "echo %text%"^|find /V ""') do (
    set /A cnt+=1
    CALL SET "out%%cnt%%=%%G"
)
FOR /L %%G IN (1,1,%cnt%) DO CALL echo %%out%%G%%
endlocal
pause

这里只是快速运行代码。

C:\Users\Squashman\Desktop>so.bat
INPUT:foobar
out1=f
out2=o
out3=o
out4=b
out5=a
out6=r
Press any key to continue . . .

这是你提供的答案,但我修正了你的逻辑错误。

@echo off
setlocal ENABLEDELAYEDEXPANSION
title Test
color a
mode 150

:start
cls
echo test
echo.
set /p text=Input:
set "texttmp=%text%"
set cnt=0

:Reader1
set /a cnt+=1
echo Val-%cnt% = !texttmp:~0,1!
set c[%cnt%]=!texttmp:~0,1!
set "texttmp=%texttmp:~1%"
if "%texttmp%" NEQ "" goto Reader1

【讨论】:

  • 它适用于前几个值,但它开始在较高的数字中变得混乱。
  • 当您使用大量输入字母时,它会开始“回显”错误的数字。例如:out1=a out3=c out2=b
  • @Gabrielnigme20,不幸的是,我不知道这在你心中意味着什么。您需要提供更好的描述或向我展示您所看到的内容。
  • 我的假设@Squashman,是set out 将按字母顺序列出out* 变量,意思是%out10%%out11%%out12%%out13%%out14%%out15% , 和 %out16% 将在 %out2%%out3%%out4%%out5%%out6%%out7%%out8%%out9% 之前输出。这当然意味着 the comment 显示 out1=a out3=c out2=b 是不正确的,因为您的代码不会发生这种情况。
  • set out 只是向您显示变量@Gabrielnigme20 的一种快速方法,而不是您问题的一部分。因此,如果您确实需要像那样显示变量,则应该使用另一种显示变量的方法。或者,您可以将set "cnt=0" 更改为set "cnt=100",并将CALL SET "out%%cnt%%=%%G" 更改为CALL SET "out%%cnt:~-2%%=%%G"
【解决方案2】:

我找到了一个更容易理解的简单解决方案(至少对我而言)

@echo off
setlocal ENABLEDELAYEDEXPANSION
title Test
color a
mode 150

:start
cls
echo test
echo.
set /p text=Input: 
set pos=1

:Reader1
echo Val-%pos% = !text:~%pos%,1!
set c[%pos%]=!text:~%pos%,1!
set /a pos=%pos%+1
if "!text:~%pos%,1!" NEQ "" goto Reader1
pause

【讨论】:

  • 您的代码不起作用。如果输入ABC,则在echo语句中只会输出BC,并且只会将BC赋给变量。
  • 我通过将 set pos=1 更改为 set pos=0 来修复它
  • 好吧,我可以根据 30 年的经验告诉您,修复仍然会给您带来问题。但我会让你自己弄清楚。
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2013-12-09
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多