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
textfile。laba2.txt
- 仅当行(
)包含点(%%A
)或逗号(
))时,才会处理
- 为循环查找另一个
行的大小
- 查找不带点(
)的行的大小 - 对逗号(
)执行相同的操作,
- 在这两种情况下,我们发现以前的线大小和当前的线大小不同。我们在相应的变量中求和结果(
或%count\u dots%
)%count\u逗号%
- 仅当行(
变量echo
- 删除临时文件
@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
textfile。laba2.txt
- 仅当行(
)包含点(%%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
- 仅当行(