在批处理脚本中从文本文件添加数字

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

根据您提供的信息,在我看来,最简单的想法是用加法运算符替换单个空格。

这是为您的 标签编写的示例:

@(
    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"

对于您的 标签:

(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 /ftokens 非常有用,如果你事先知道有多少个标记。一个简单的 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