Windows 循环赢得的批处理文件';t形环

Windows 循环赢得的批处理文件';t形环,windows,file,batch-file,for-loop,Windows,File,Batch File,For Loop,我在做作业。试图让我的批处理文件读取输入文件的各行,并计算出它有多少个点和逗号。但是,无论我做什么,循环只运行一次,因此只有文件的第一行被正确处理,即使有多行。我错过了什么 REM @echo off setlocal enabledelayedexpansion set count=-2 for /F "delims=" %%I in (laba2.txt) DO ( set initial=%%I set b = !initial! :againdot set oldb=!b! set "b

我在做作业。试图让我的批处理文件读取输入文件的各行,并计算出它有多少个点和逗号。但是,无论我做什么,循环只运行一次,因此只有文件的第一行被正确处理,即使有多行。我错过了什么

REM @echo off
setlocal enabledelayedexpansion
set count=-2
for /F "delims=" %%I in (laba2.txt) DO (
set initial=%%I
set b = !initial!
:againdot
set oldb=!b!
set "b=!b:*.=!"
set /a count+=1
echo "b = !b!, oldb = !oldb!"
if not !oldb! == !b! goto :againdot
set b=!initial!
:againcomma
set oldb=!b!
set "b=!b:*,=!"
set /a count+=1
echo "b = !b!, oldb = !oldb!"
if not !oldb! == !b! goto :againcomma
)
echo %count%
当然,我读过其他类似的问题,但我不知道这些问题如何适用于我的问题,所以如果这是重复的话,我很抱歉

哦,如果你有更好的方法来计算单个角色,我很乐意听你这么说,但这不是重点

编辑:这里是CMD提要

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>test.bat

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>REM @echo off

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>setlocal enabledelayedexpansion

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set count=-2

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>for /F "delims=" %I in (laba2.txt) DO (
set initial=%I
 set b = !initial!
 set oldb=!b!
 set "b=!b:*.=!"
 set /a count+=1
 echo "b = !b!, oldb = !oldb!"
 if not !oldb! == !b! goto :againdot
 set b=!initial!
 set oldb=!b!
 set "b=!b:*,=!"
 set /a count+=1
 echo "b = !b!, oldb = !oldb!"
 if not !oldb! == !b! goto :againcomma
)

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>(
set initial=this,is .a random
 set b = !initial!
 set oldb=!b!
 set "b=!b:*.=!"
 set /a count+=1
 echo "b = !b!, oldb = !oldb!"
 if not !oldb! == !b! goto :againdot
 set b=!initial!
 set oldb=!b!
 set "b=!b:*,=!"
 set /a count+=1
 echo "b = !b!, oldb = !oldb!"
 if not !oldb! == !b! goto :againcomma
)
"b = *.=, oldb = "

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set oldb=!b!

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set "b=!b:*.=!"

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set /a count+=1

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>echo "b = !b!, oldb = !oldb!"
"b = =, oldb = *.="

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>if not !oldb! == !b! goto :againdot

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set oldb=!b!

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set "b=!b:*.=!"

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set /a count+=1

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>echo "b = !b!, oldb = !oldb!"
"b = =, oldb = ="

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>if not !oldb! == !b! goto :againdot

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set b=!initial!

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set oldb=!b!

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set "b=!b:*,=!"

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set /a count+=1

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>echo "b = !b!, oldb = !oldb!"
"b = is .a random, oldb = this,is .a random"

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>if not !oldb! == !b! goto :againcomma

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set oldb=!b!

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set "b=!b:*,=!"

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>set /a count+=1

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>echo "b = !b!, oldb = !oldb!"
"b = is .a random, oldb = is .a random"

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>if not !oldb! == !b! goto :againcomma

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>echo 3
3

C:\Users\fiksi\Desktop\Учёбка\ОС 3с\Лаба 2>
这是我想读的文件:

this,is .a random
..,arran,gement of.

commas  and,
 dots 
Windows命令处理器不支持跳转到FOR主体内的标签。FOR主体内的标签会导致未定义的脚本执行行为

@外交部在评论中说

所以,你不能那样做!如果理解了,您希望创建一个批处理文件,该文件将显示一个文件有多少个点和逗号。我已完全更改了您的文件,并编写了一个新文件:

@echo关闭
设置/a“点数=0”
设置/a“计数\逗号=0”
powershell.exe-NoP-C“(获取内容laba2.txt)-替换“!”,“|设置内容$env:TEMP\laba2_tmp.txt”
setlocal EnableDelayedExpansion
对于/f“delims=eol=“%A IN(%TEMP%\laba2\u tmp.txt)do(
设置行=%%A
rem查找变量的大小:
(echo!line!)>%TEMP%\TEMP.txt
对于(%TEMP%\TEMP.txt)中的%%B,请设置大小=%%~zB
rem检查线路是否有逗号:
如果不是“!line:,=!”==“!line!”(
rem查找变量*的大小,不带*逗号:
(回音!行:,=!)>%TEMP%\TEMP.txt
对于(%TEMP%\TEMP.txt)中的%%B,请设置sizecommas=%%~zB
rem查找以前和新变量大小的差异:
if!size!NEQ!sizecommas!(设置/a“diffcommas=size sizecommas”&设置/a“count\u commas+=diffcommas”)
rem检查线是否有点:
如果不是“!line:.=!”=“!line!”(
rem查找不带*点的变量*的大小:
(回音!行:.=!)>%TEMP%\TEMP.txt
对于(%TEMP%\TEMP.txt)中的%%B,请设置SizeTos=%%~zB
rem查找以前和新变量大小的差异:
if!size!NEQ!sizedots!(设置/a“diffdots=size sizedots”&设置/a“count\u dots+=diffdots”)
)
)
)
rem删除临时文件:
del%TEMP%\TEMP.txt%TEMP%\laba2\u tmp.txt
如果%count_dots%==1(回送在指定文档中找到%count_dots%dot。)否则(回送在指定文档中找到%count_dots%dots.)
如果%count_逗号%==1(echo在指定文档中找到%count_逗号%commas。)否则(echo在指定文档中找到%count_逗号%commas.)
暂停
是的,它确实很大,但我不能进一步简化它,原因是:)

此文件:

  • 将所需变量设置为
    0
  • 有一个
    for
    循环,循环通过
    laba2.txt
    textfile。
    • 仅当行(
      %%A
      )包含点(
      )或逗号(
      )时,才会处理
    • 为循环查找另一个
      行的大小
    • 查找不带点(
      )的行的大小
    • 对逗号(
      )执行相同的操作
    • 在这两种情况下,我们发现以前的线大小和当前的线大小不同。我们在相应的变量中求和结果(
      %count\u dots%
      %count\u逗号%
  • echo
    变量
  • 删除临时文件
Windows命令处理器不支持跳转到FOR主体内的标签。FOR主体内的标签会导致未定义的脚本执行行为

@外交部在评论中说

所以,你不能那样做!如果理解了,您希望创建一个批处理文件,该文件将显示一个文件有多少个点和逗号。我已完全更改了您的文件,并编写了一个新文件:

@echo关闭
设置/a“点数=0”
设置/a“计数\逗号=0”
powershell.exe-NoP-C“(获取内容laba2.txt)-替换“!”,“|设置内容$env:TEMP\laba2_tmp.txt”
setlocal EnableDelayedExpansion
对于/f“delims=eol=“%A IN(%TEMP%\laba2\u tmp.txt)do(
设置行=%%A
rem查找变量的大小:
(echo!line!)>%TEMP%\TEMP.txt
对于(%TEMP%\TEMP.txt)中的%%B,请设置大小=%%~zB
rem检查线路是否有逗号:
如果不是“!line:,=!”==“!line!”(
rem查找变量*的大小,不带*逗号:
(回音!行:,=!)>%TEMP%\TEMP.txt
对于(%TEMP%\TEMP.txt)中的%%B,请设置sizecommas=%%~zB
rem查找以前和新变量大小的差异:
if!size!NEQ!sizecommas!(设置/a“diffcommas=size sizecommas”&设置/a“count\u commas+=diffcommas”)
rem检查线是否有点:
如果不是“!line:.=!”=“!line!”(
rem查找不带*点的变量*的大小:
(回音!行:.=!)>%TEMP%\TEMP.txt
对于(%TEMP%\TEMP.txt)中的%%B,请设置SizeTos=%%~zB
rem查找以前和新变量大小的差异:
if!size!NEQ!sizedots!(设置/a“diffdots=size sizedots”&设置/a“count\u dots+=diffdots”)
)
)
)
rem删除临时文件:
del%TEMP%\TEMP.txt%TEMP%\laba2\u tmp.txt
如果%count_dots%==1(回送在指定文档中找到%count_dots%dot。)否则(回送在指定文档中找到%count_dots%dots.)
如果%count_逗号%==1(echo在指定文档中找到%count_逗号%commas。)否则(echo在指定文档中找到%count_逗号%commas.)
暂停
是的,它确实很大,但我不能进一步简化它,原因是:)

此文件:

  • 将所需变量设置为
    0
  • 有一个
    for
    循环,循环通过
    laba2.txt
    textfile。
    • 仅当行(
      %%A
      )包含点(
      )或逗号(
      )时,才会处理
    • 循环查找另一个
      行的大小
    • 查找不带点(
      )的行的大小
    • 是吗
      @echo off
      setlocal EnableExtensions DisableDelayedExpansion
      set "TotalCountComma=0"
      set "TotalCountDot=0"
      
      for /F "usebackq delims= eol=" %%I in ("laba2.txt") do (
          set "Line=%%I"
          call :Count
      )
      
      if %TotalCountComma% == 1 (set "CommaS=") else set "CommaS=s"
      if %TotalCountDot% == 1 (set "DotS=") else set "DotS=s"
      echo The file contains %TotalCountComma% comma%CommaS% and %TotalCountDot% dot%DotS%.
      endlocal
      goto :EOF
      
      :Count
      setlocal EnableDelayedExpansion
      set "LineCountComma=0"
      set "LineCountDot=0"
      set "LineLength=1"
      for /L %%J in (0,1,8192) do (
          if "!Line:~%%J,1!" == "" goto ExitLoop
          if "!Line:~%%J,1!" == "," set /A LineCountComma+=1
          if "!Line:~%%J,1!" == "." set /A LineCountDot+=1
      )
      :ExitLoop
      endlocal & set /A "TotalCountComma+=%LineCountComma%" & set /A "TotalCountDot+=%LineCountDot%"
      goto :EOF