在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!
)
)
)
我现在正在处理我在本文中提到的更大的问题 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!
)
)
)