比较for循环中数字的绝对值,以确定它是否被使用?

时间:2017-03-07 03:57:37

标签: batch-file cmd errorlevel

我现在谈到我在这篇文章中提到的更大问题...... Searching a text file and sending only numbers greater than a certain absolute value to text file?

我认为如果我set num=!num:-=!的原始值为-17,那么!errorlevel!会评估为真或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

3 个答案:

答案 0 :(得分:2)

@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

答案 1 :(得分:0)

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

这将num确定为%%b的算术值。请注意,环境变量始终字符串。分配根据需要以单向方式进行转换。您的作业将指定一个值(例如)"-4"(包括引号)

第二个命令使用num中的字符串并将所有-更改为*nothing*,因此计算absolte值,假设它是适当的{{1}结构。

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

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

您没有说明您的echo业务的目的是什么......

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过滤器的每一行,如果缺少column4,则生成星号,然后将findstr设置为num中的值,并从中删除任何%%b 。如果结果数字> 3,则回显原始- - 好吧,我已经为完整性生成了报告行。显然,这可以是%%b

答案 2 :(得分:0)

@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!
        )
    )
)