在批处理脚本中从文本文件添加数字
Adding numbers from text file in batch script
我遇到了批处理脚本的问题。我必须制作脚本来添加位于文本文件中的数字。
数字在文件的一行中并以空格分隔。
我必须使用 for
循环来完成。
我做了这个:
setlocal EnableDelayedExpansion
set /a wynik=0
for /f "tokens=1* delims= " %%a in (liczby.txt) do (set /a wynik+=%%a)
echo %wynik% > wynik.txt
输出为:
C:\Users\NuClear\Desktop\arch>setlocal EnableDelayedExpansion
C:\Users\NuClear\Desktop\arch>set /a wynik=0
C:\Users\NuClear\Desktop\arch>for /F "tokens=1* delims= " %a in (liczby.txt) do (set /a wynik+=%a )
C:\Users\NuClear\Desktop\arch>(set /a wynik+=1 )
C:\Users\NuClear\Desktop\arch>echo 1 1>wynik.txt
我不明白为什么 1
之后没有下一个 tokens
。
根据您提供的信息,在我看来,最简单的想法是用加法运算符替换单个空格。
这是为您的 batch-file 标签编写的示例:
@(
For /F "UseBackQ Delims=" %%G In (
"liczby.txt"
) Do @(
Set "}=%%G"
For /F "Delims=" %%H In (
'%SystemRoot%\System32\cmd.exe /V /D /C "Set /A "!}: ^=+!""'
) Do @Echo(%%H
)
) 1>"wynik.txt"
对于您的 cmd 标签:
(For /F "UseBackQ Delims=" %G in ("liczby.txt") Do @Set "}=%G" & For /F "Delims=" %H In ('%SystemRoot%\System32\cmd.exe /V /D /C "Set /A "!}: ^=+!""') Do @Echo(%H) 1>"liczby.txt"
当前的回复可能以不同的方式解读了您的问题,因为它不够清晰或缺乏示例,所以我上面的回答假设 liczby.txt
看起来有点像这样:
1 2 3 4 5
6 7 8 9
10 11 12
13 14
...结果 wynik.txt
看起来像这样:
15
30
33
27
如果您想使用单个 FOR
命令完成此操作,这是另一个选项。此选项的关键是使用 CMD.exe
和 /U
选项。
@echo off
set "wynik=0"
for /F "delims=" %%G in ('cmd /D /U /C type liczby.txt ^| find /V ""') do (
set /A "wynik+=%%G" 2>nul
)
>wynik.txt echo %wynik%
更简单的方法:
@echo off
setlocal
set /P "line=" < liczby.txt
set /A "wynik=%line: =+%"
> wynik.txt echo %wynik%
此方法假定 "数字在文件的一行中,每个数字由 一个 space 分隔" , 在行的开头或结尾没有 spaces。
您没有指定是否必须使用 for
来读取文件或仅用于添加部分。
REM read the (first line of the) file into a variable:
<liczby.txt set /p "line="
REM or using a FOR /F to read the file:
REM for /f "delims=" %%a in (liczby.txt) do set "x=%%a"
REM add them up:
set "y=0"
for %%a in (%line%) do set /a y+=%%a
echo Sum: %y%
for /f
和 tokens
非常有用,如果你事先知道有多少个标记。一个简单的 for
只为每个标记执行(使用标准分隔符),可能有多少。
我假设您有一个文本文件 liczby.txt
,其内容如下:
1 2 3
当您使用 for /F
循环阅读它时,将会有一次迭代,因为只有一行。在此迭代中,选项字符串指定的所有标记都在各自的元变量中返回。
但是您需要的是其他东西,您想要遍历各个数字,这可以使用标准 for
循环来实现:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Initialise sum:
set /A "wynik=0"
rem // Read the input text file line by line:
for /F "usebackq tokens=*" %%J in ("liczby.txt") do (
rem // Loop through individual items/numbers:
for %%I in (%%J) do (
rem // Sum up the numbers:
set /A "wynik+=%%I"
)
)
rem // Write sum into output file:
> "wynik.txt" echo(%wynik%
endlocal
exit /B
我遇到了批处理脚本的问题。我必须制作脚本来添加位于文本文件中的数字。
数字在文件的一行中并以空格分隔。
我必须使用 for
循环来完成。
我做了这个:
setlocal EnableDelayedExpansion
set /a wynik=0
for /f "tokens=1* delims= " %%a in (liczby.txt) do (set /a wynik+=%%a)
echo %wynik% > wynik.txt
输出为:
C:\Users\NuClear\Desktop\arch>setlocal EnableDelayedExpansion
C:\Users\NuClear\Desktop\arch>set /a wynik=0
C:\Users\NuClear\Desktop\arch>for /F "tokens=1* delims= " %a in (liczby.txt) do (set /a wynik+=%a )
C:\Users\NuClear\Desktop\arch>(set /a wynik+=1 )
C:\Users\NuClear\Desktop\arch>echo 1 1>wynik.txt
我不明白为什么 1
之后没有下一个 tokens
。
根据您提供的信息,在我看来,最简单的想法是用加法运算符替换单个空格。
这是为您的 batch-file 标签编写的示例:
@(
For /F "UseBackQ Delims=" %%G In (
"liczby.txt"
) Do @(
Set "}=%%G"
For /F "Delims=" %%H In (
'%SystemRoot%\System32\cmd.exe /V /D /C "Set /A "!}: ^=+!""'
) Do @Echo(%%H
)
) 1>"wynik.txt"
对于您的 cmd 标签:
(For /F "UseBackQ Delims=" %G in ("liczby.txt") Do @Set "}=%G" & For /F "Delims=" %H In ('%SystemRoot%\System32\cmd.exe /V /D /C "Set /A "!}: ^=+!""') Do @Echo(%H) 1>"liczby.txt"
当前的回复可能以不同的方式解读了您的问题,因为它不够清晰或缺乏示例,所以我上面的回答假设 liczby.txt
看起来有点像这样:
1 2 3 4 5
6 7 8 9
10 11 12
13 14
...结果 wynik.txt
看起来像这样:
15
30
33
27
如果您想使用单个 FOR
命令完成此操作,这是另一个选项。此选项的关键是使用 CMD.exe
和 /U
选项。
@echo off
set "wynik=0"
for /F "delims=" %%G in ('cmd /D /U /C type liczby.txt ^| find /V ""') do (
set /A "wynik+=%%G" 2>nul
)
>wynik.txt echo %wynik%
更简单的方法:
@echo off
setlocal
set /P "line=" < liczby.txt
set /A "wynik=%line: =+%"
> wynik.txt echo %wynik%
此方法假定 "数字在文件的一行中,每个数字由 一个 space 分隔" , 在行的开头或结尾没有 spaces。
您没有指定是否必须使用 for
来读取文件或仅用于添加部分。
REM read the (first line of the) file into a variable:
<liczby.txt set /p "line="
REM or using a FOR /F to read the file:
REM for /f "delims=" %%a in (liczby.txt) do set "x=%%a"
REM add them up:
set "y=0"
for %%a in (%line%) do set /a y+=%%a
echo Sum: %y%
for /f
和 tokens
非常有用,如果你事先知道有多少个标记。一个简单的 for
只为每个标记执行(使用标准分隔符),可能有多少。
我假设您有一个文本文件 liczby.txt
,其内容如下:
1 2 3
当您使用 for /F
循环阅读它时,将会有一次迭代,因为只有一行。在此迭代中,选项字符串指定的所有标记都在各自的元变量中返回。
但是您需要的是其他东西,您想要遍历各个数字,这可以使用标准 for
循环来实现:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Initialise sum:
set /A "wynik=0"
rem // Read the input text file line by line:
for /F "usebackq tokens=*" %%J in ("liczby.txt") do (
rem // Loop through individual items/numbers:
for %%I in (%%J) do (
rem // Sum up the numbers:
set /A "wynik+=%%I"
)
)
rem // Write sum into output file:
> "wynik.txt" echo(%wynik%
endlocal
exit /B