Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 变量字符串批处理中每个字符的循环_Loops_Batch File_Character - Fatal编程技术网

Loops 变量字符串批处理中每个字符的循环

Loops 变量字符串批处理中每个字符的循环,loops,batch-file,character,Loops,Batch File,Character,我试图循环遍历字符串中的每个字符。但是,我只知道如何使用以下命令循环字符串中的每个单词: (set /P MYTEXT=)<C:\MYTEXTFILE.txt set MYEXAMPLE=%MYTEXT% for %%x in (%MYEXAMPLE%) do ( ECHO DO SOMTHING ) (set/P MYTEXT=)AFAIK,FOR无法进行字符级迭代-一种可能的解决方法是构建如下循环: @ECHO OFF :: string terminator: chose som

我试图循环遍历字符串中的每个字符。但是,我只知道如何使用以下命令循环字符串中的每个单词:

(set /P MYTEXT=)<C:\MYTEXTFILE.txt

set MYEXAMPLE=%MYTEXT%
for %%x in (%MYEXAMPLE%) do (
ECHO DO SOMTHING
)

(set/P MYTEXT=)

AFAIK,

FOR
无法进行字符级迭代-一种可能的解决方法是构建如下循环:

@ECHO OFF
:: string terminator: chose something that won't show up in the input file
SET strterm=___ENDOFSTRING___
:: read first line of input file
SET /P mytext=<C:\MYTEXTFILE.txt
:: add string terminator to input
SET tmp=%mytext%%strterm%
:loop
:: get first character from input
SET char=%tmp:~0,1%
:: remove first character from input
SET tmp=%tmp:~1%
:: do something with %char%, e.g. simply print it out
ECHO char: %char%
:: repeat until only the string terminator is left
IF NOT "%tmp%" == "%strterm%" GOTO loop
@ECHO关闭
::字符串终止符:选择了输入文件中不会显示的内容
设置strterm=\uuuuuu ENDOFSTRING___
::读取输入文件的第一行

SET/P mytext=

这是一种简单而直接的方法,可以循环遍历字符串中的每个字符:

@echo off
setlocal ENABLEDELAYEDEXPANSION

set /P mytext= < MYTEXTFILE.txt
echo Line is '%mytext%'

set pos=0
:NextChar
    echo Char %pos% is '!mytext:~%pos%,1!'
    set /a pos=pos+1
    if "!mytext:~%pos%,1!" NEQ "" goto NextChar
@echo关闭
setlocal ENABLEDELAYEDEXPANSION
set/P mytext=
下面的
splitStr
子例程:

  • 将逐个打印字符串中的每个字符
  • 无论延迟扩展的状态如何,都可以安全地调用
  • 没有超流
    goto
    循环
  • 处理CR和LF
  • errorLevel
    设置为字符串中的字符数

是的,这回答了我的想法,那就是我们不能文盲的字符。这也解释了我的循环工作的原因以及退出程序loopadd
setlocal enabledelayed expansion
时可能存在的解决方案,或者下一个注释是“不工作”
;)
(看在上帝的份上,删除
mytext
=
之间的空格)@Stephan,谢谢。在我的系统上,不需要“SetLocalEnableDelayedExpansion”,但这很有道理。我测试了有空格和没有空格的集合,在我的系统上没有区别,我发现有空格的集合更可读。我想我已经很多年没有真正做球拍了吧?空格在
cmd
中起着决定性的作用(
set var=value
将变量
%var%
设置为
value
)。你使用什么系统(扩展)?@Stephan,是的,我知道。但是对于这种情况,是否使用/P选项进行了测试?显然那里的空间是允许的。是的,对于一个bat程序员来说,空间看起来是错误的,因为通常的情况(正如你所指出的),但是在其他语言中,我倾向于添加空间,按照目前的习惯也是如此。意识到我的“错误”后,我惊讶地发现它居然完全起作用了,于是离开了这个空间(直到你提醒我它看起来有多奇怪)。给它一个测试。如果带有/P的空间给您带来问题,请告诉我是哪个Windows版本。谢谢。当然,我做了测试。空间确实很重要。我使用Win10(版本10.0.10586)和Win7 Enterprise(版本6.1.7601)。(两者均无任何扩展)。也从未听说过像你这样的话(不是说,你在撒谎。但如果有“不相容”,我想知道)。(注意:
set/a
实际上并不关心空格-但那是
/a
,而不是
/p
或普通
set
@echo off & setLocal enableExtensions disableDelayedExpansion
(call;) %= sets errorLevel to 0 =%

set "testStr=uncopyrightable"
call :splitStr testStr
if errorLevel 1 (
    >&2 echo(string is %errorLevel% char(s^) in length
) else (
    >&2 echo(empty string
    goto die
) %= if =%
goto end

:die
(call) %= sets errorLevel to 1 =%
:end
endLocal & goto :EOF

:splitStr string=
:: outputs string one character per line
setLocal disableDelayedExpansion
set "var=%1"

set "chrCount=0" & if defined var for /f "delims=" %%A in ('
    cmd /v:on /q /c for /l %%I in (0 1 8190^) do ^
    if "!%var%:~%%I,1!" neq "" (^
    echo(:^!%var%:~%%I^,1^!^) else exit 0
') do (
    set /a chrCount+=1
    echo%%A
) %= for /f =%

endLocal & exit /b %chrCount%