2

我在我正在编写的 bat 文件中发现了一个错误,并且偶然找到了一个修复程序,但是我不明白为什么修复程序有效。这最终​​是我的问题,或者如果这个逻辑还有其他我没有发现的问题。

该脚本在 2 个或更多文件中计算行数,然后目标是找到行数最少的文件,然后在脚本稍后的变量中使用该计数作为参数。

示例文件 1(9 行):

Wrote,0
Wrote,1
Wrote,2
Wrote,3
Wrote,4
Wrote,5
Wrote,6
Wrote,7
Wrote,8

示例文件 2(10 行):

Wrote,0
Wrote,1
Wrote,2
Wrote,3
Wrote,4
Wrote,5
Wrote,6
Wrote,7
Wrote,8
Wrote,9

我看到的主要区别是文件 2 中的第 9 行和第 10 行是两位数的行号

注意:我不是指每行的实际值,而是指行号的计数值,因为我的代码不会尝试解析行,而只是获取行数。

在我创建的代码顶部附近,然后将每个文件的计数值附加到一个名为 ~numbers.txt 的临时文件中,以便在这里模拟该过程,假设我的起始代码是:

echo 9 > ~numbers.txt
echo 10 >> ~numbers.txt
type  ~numbers.txt

所以现在我有一个包含两行“9”和“10”的文件,当然 9 低于 10,但它也比 10 少一位。

现在我尝试通过将第一行读入变量然后循环并评估当前值是否小于先前值来找到文件 ~numbers.txt 中包含的最小数字。

setlocal enabledelayedexpansion
set /p lowest=<~numbers.txt

FOR /F "delims=" %%G in (~numbers.txt) DO IF %%G LSS !lowest! SET lowest=%%G
echo  lowest num = %lowest%

当我运行这段代码时,我得到了这个错误的输出:

最低数量 = 10

我发现如果我从 FOR 循环中删除“delims=”,我将得到正确的结果 9。

还有,是什么真正搞砸了我对这个问题的理解;如果我只将 ~numbers.txt 中的值更改为 10 和 100 并单独保留 FOR 循环行(保持"delims="),那么我得到正确的值 10 作为我的答案???

这很糟糕,因为这意味着我的逻辑有缺陷,并且其他数字组合也会产生不同的结果。

谁能向我解释为什么会这样和/或举例说明如何获得正确的最低数字而不管值如何?

谢谢...

4

1 回答 1

4

如果你没有看到某些东西,并不意味着它不存在。(我在这里说的是空格)试试这个:

> ~numbers.txt echo 9<press ENTER immediately>
>> ~numbers.txt echo 10<press ENTER immediately>

这将是真正的所见即所得,行尾没有空格,没有文本比较,if因为字符串并非全是数字。当然,正如您已经注意到的那样,使用默认分隔符(其中一个是空格)去除空格也可以正常工作。

考虑这种确定最低行数的方法:

set /a minlines=0x7FFFFFFF
for /f "tokens=2 delims=:" %%a in ('find /c /v "" *.txt') do set /a minlines="%%a-(minlines-%%a)*(minlines-%%a>>255)"
echo %minlines%

注意:没有 ifs,没有延迟扩展

于 2012-06-07T19:58:10.047 回答