在for循环中比较一个数的绝对值来判断是否使用?

Compare the absolute value of a number in a for loop to determine if it's to be used?

我现在正在处理我在本文中提到的更大的问题 post...Searching a text file and sending only numbers greater than a certain absolute value to text file?

我想如果我 set num=!num:-=! 的原始值是 -17,那么 !errorlevel! 将评估为 true 或 0 对吗?不过这里有些东西不工作...

为了澄清,我只需要过滤掉第四个标记大于 3 或小于 -3 的行的第一个和第四个标记,以及任何没有第四个标记的行 (这部分已解决)。我已经尝试使用 set 的 /A 选项,但它似乎仍然无法正常工作。

setlocal enabledelayedexpansion

set "min=-"

for /f "tokens=1,4" %%a in ('findstr /b /r /c:"[^ ]*:S:" print.log') do (
    if %%b=="" (echo %%a ^*^*^* >>new.txt) else (
        set num="%%b"
        set num=!num:-=!
        if !errorlevel!==0 (
            if !num! GTR 3 echo %%a !min!!num! >> new.txt
        ) else (
            if !num! GTR 3 echo %%a !num! >> new.txt
        )
    )
)

exit /b

print.log 中的文字如下所示:

ksdf 0 0 -4

as7d:S:asf 0 0 -4

kc:S:cd3 0 0 -2

asdk:S:s 0 0 6

lasd:S:dd 0 0

set /A num=%%b
set num=!num:-=!

这就建立了num作为%%b的算术值。请注意,环境变量是 always 字符串。分配根据需要以每种方式进行转换。您的作业会分配一个值(例如)"-4"(包括引号)

第二个命令使用 num 中的 string 并将所有 - 更改为 *nothing* 因此计算绝对值假设它是适当的 -number 结构。

除此之外,我不知道您创建输出的意图是什么,因为您没有指明输出应该是什么。无论哪种方式,errorlevel 都不会受到 set AFAIAA 的影响。

请注意,%%b 仍将包含在您使用 echo 时读取的原始数字。您可以在 %%b!num! 上执行 if - 并根据需要在 echo 中使用 %%b!num!

您没有说明您的 gtr 3 业务旨在做什么...


@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q42639932.txt"
FOR /f "tokens=1,4" %%a IN ('findstr /b /r /c:"[^ ]*:S:" "%filename1%"') DO (
 if "%%b"=="" (echo %%a ^*^*^*) else (
  set num=%%b
  set num=!num:-=!
  if !num! GTR 3 (echo %%a %%b 
  ) else (
  ECHO just FOR demo %%a %%b
  )
 )
)

GOTO :EOF

您需要更改 sourcedir 的设置以适合您的情况。

我使用了一个名为 q42639932.txt 的文件,其中包含您的数据 + 用于我的测试的额外内容。

对于通过 findstr 过滤器的每一行,如果缺少第 4 列,则生成星号,否则将 num 设置为 %%b 中的值,并删除任何 -从中。如果结果数大于 3,则回显原始 %%b 否则 - 好吧,为了完整性,我制作了一个报告行。显然,这可以 rem 解决。

@echo off
    setlocal enableextensions disabledelayedexpansion

    >"new.txt" (
        for /f "tokens=1,4" %%a in ('
            findstr /b /r /c:"[^ ]*:S:" print.log
        ') do if "%%~b"=="" (echo %%a ***) else (
            set "print=1" 
            if %%b lss 4 if %%b gtr -4 set "print="
            if defined print echo %%a %%b
        )
    )

当值小于-3或大于3时不打印,当值小于4且大于-4时不打印

-6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6
          ^.................^
              don't print
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
set "threshold=3"
>new.txt (
    for /f "tokens=1,4" %%a in ('findstr /b /r /c:"[^ ]*:S:" print.log') do (
        if "%%b"=="" (
            echo %%a ^*^*^*
        ) else (
            set /A num=%%b
            if !num! GEQ 0 (
                set "min="
            ) else (
                set "num=!num:-=!"
                set "min=-"
            )
            if !num! GTR %threshold% echo %%a !min!!num!
        )
    )
)