Batch file 查找两个字符之间的最大数

Batch file 查找两个字符之间的最大数,batch-file,cmd,Batch File,Cmd,我正在试图找到[和]之间的最大数字。到目前为止我什么也没有得到 示例文本文件: a.(1234)[00012] bb.(4321)[00100] ccc.(9876)[10101] dd.(6789)[01010] e.(5555)[00021] 期望输出: 10101 这其实并不难 @echo off setlocal EnableExtensions EnableDelayedExpansion set "MaxNumber=0" for /F "tokens=2 delims=[]"

我正在试图找到
[
]
之间的最大数字。到目前为止我什么也没有得到

示例文本文件:

a.(1234)[00012]
bb.(4321)[00100]
ccc.(9876)[10101]
dd.(6789)[01010]
e.(5555)[00021]
期望输出:

10101

这其实并不难

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "MaxNumber=0"
for /F "tokens=2 delims=[]" %%V in (Example.txt) do (
    if not "%%V"=="" (
        for /F "tokens=* delims=0" %%N in ("%%V") do if %%N GTR !MaxNumber! set "MaxNumber=%%N"
    )
)
echo Biggest number is: %MaxNumber%
endlocal
有关所用命令的详细信息,请在命令提示窗口中执行

  • 获取/?
    帮助获取
  • 如果/?
    帮助如果
  • 设置/?
    帮助设置
  • setlocal/?
    帮助setlocal
删除前导零的行取自

编辑:

我将for循环移动到另一个循环中,以删除尾随的零,以避免数字被解释为八进制数。感谢您的提示。

@ECHO OFF
SETLOCAL
设置/a maxnum=0
设置“maxraw=”
对于(q27649334.txt)中的/f“tokens=2delims=[]”%%a,请调用:max%%a
回显最大值为“%maxraw%”,值为%maxnum%
后藤:EOF
:max
设置候选项=%1
:maxl
如果不是“%candidate%”,则==“0”如果“%candidate:~0,1%”==“0”设置“candidate=%candidate:~1%”并转到maxl
如果%candidate%lss%maxnum%GOTO:EOF
SET/a maxnum=候选
:setmax
设置“maxraw=%1”
后藤:eof
我使用了一个名为
q27649334.txt
的文件,其中包含用于测试的数据

这假定
[…]
中的字符串始终是纯数字和0..9999999

如果字符串可以更长,则需要进行不同的比较


不清楚您想要的是数值还是具有最高数值的字符串,因此两者都可以。如果未定义
maxraw
,则
maxnum
将为
0
假设您的数字始终在第一组方括号内,并且假设数字从未超过2147483647,则您可以使用:

@echo off
setlocal enableDelayedExpansion
set "max=0"
for /f "tokens=2 delims=[]" %%A in (example.txt) do (
  for /f "tokens=* delims=0" %%B in ("%%A") do if %%B gtr !max! set "max=%%B"
)
echo max=%max%
第一个循环从括号中提取数字。第二个循环去掉任何前导零。这不仅是OP要求的,而且对于IF语句正确解释数字也是至关重要的。IF将把带前导零的数字视为八进制表示法,这将给出错误的结果。值为0的行将被完全跳过。但这是可以的,即使所有的值都是0,因为max被初始化为0

如果其中任何一个值超过2147483647,或者由于输入文件太大,上面的速度很慢,那么我将使用my,它可以正确排序最多20位的非负整数,并快速返回具有最高值的单行。是混合JScript/批处理脚本,将从XP开始在任何Windows计算机上运行

只有当数字从不为负时,这才有效。如果输入文件很大,速度应该会明显加快

@echo off
setlocal
set "max=0"
for /f "tokens=2 delims=[]" %%A in (
  'type example.txt ^| jsort /d "[" /t 2 /n /r /c 1'
) do for /f "tokens=* delims=0" %%B in ("%%A") do set "max=%%B"
echo max=%max%

展示你的尝试。就像我在帖子上说的,我一无所获。我甚至不知道从哪里开始。你为什么要用批处理文件呢?试试python,它会简单得多。我正在尽可能多地学习批处理编程。是的,这就像试图用筷子捕捉苍蝇,将其与更高级的语言进行比较。没有人能否认。但是它有一个特别的优点。对我来说,批处理比Python更难。有可能用这个@Mofi删除前导零吗?不要靠近一台无法测试的计算机。但是,
set/a Number*=1
不是从整数中去掉前导零的更简单、更有效的方法吗?@rojo-否,因为0前缀数字被解释为八进制-这不是您想要的。对于像08或09这样的数字,它将完全失败,但是像010这样的数字将被解释为十进制8。事实上,出于同样的原因,这个答案不起作用。如果09全球技术法规8因八进制问题评估为假。无效的八进制值强制进行字符串比较。由于所有数字的宽度都是固定的,因此可以使用
if“%%V“gtr”!Number!”
。@dbenham@Magoo我找到了一种从整数中去掉前导零的好方法
cmd/c退出/b%Number%
,然后
set Number=%ERRORLEVEL%