【问题标题】:In a Batch file, How do I get files with the largest number in the names?在批处理文件中,如何获取名称中数字最大的文件?
【发布时间】:2013-04-24 17:05:31
【问题描述】:

我需要在命令提示符窗口批处理文件中执行此操作。我有一个批处理文件,我需要比较两个文件的文件名;例如我有 whatever-5428.jarwhatever-9001.jar 可能还有更多 whatever*.jar 文件。

我需要为我的批处理文件制作一个脚本,以便它使用编号最高的 jar。 (9001高于5428)。这让我更加困难,因为我不能做java -jar -Xmx2G -XX:MaxPermSize=256m whatever*.jar,因为 java 不喜欢通配符。

我需要将它与上面的 java 脚本一起使用,因为我使用一定数量的 RAM 和 Perm Size 启动它。

在批处理文件中,我怎样才能得到其中编号最大的jar文件?我完全不知道如何使用 java,我只是从批处理文件中启动它,也许有一些方法可以使用某些方法来检查具有最高编号的文件,然后使用以下命令行启动该文件:@987654326 @

在此处查看我的批处理文件:http://www.fileswap.com/dl/XyvIN2VpgF/

【问题讨论】:

  • @Eric Leschinski 我的意思是最后一个数字最大的人
  • 您也可以使用一个小的 java 脚本来决定加载哪个 jar 并从 java 脚本中进行最终启动,但我很好奇为什么您不知道要提前使用哪个 jar时间。 Maven 非常适合跟踪 jar 依赖项
  • @kdubb 我正在处理一些 jar 文件,它会从一些网站上自动更新它们(它们的文件名按版本命名,例如 4005、8119)。然后我需要确定编号最大的文件名,这样我就可以让我的批处理文件删除其余的文件并运行编号最大的文件名。我看到了 FindStr 的东西,但如果我可能有多个文件,我不确定它是否兼容,并且如前所述,它非常有限。我希望它纯粹是批处理的,所以它不需要任何外部文件,只需要 .bat 本身。
  • 是否可以在下载新文件时让自动更新程序删除旧文件?这似乎是您以后不想担心的事情,如果没有同一个 jar 的多个版本,创建批处理文件会更容易。
  • @kdubb 我明白你的意思但是它会在下载之前检查更新但是如果没有可用的更新,它将不会更新。

标签: java cmd filenames


【解决方案1】:

我会使用Java Regex 解析出数字以在两个文件之间进行比较。正则表达式非常灵活,可以处理通配符

编辑: 请参阅下面的输出示例:

public static void main(String[] args) throws Exception
{
    System.out.println(getTrailingNumber("whatever-5428.jar"));
    System.out.println(getTrailingNumber("whatever-9001.jar"));
}

public static String getTrailingNumber(String filename)
{
    Pattern pattern = Pattern.compile("-(\\d+)\\.");

    Matcher matcher = pattern.matcher(filename);
    matcher.find();

    return matcher.group(1);
}

输出:

5428
9001

【讨论】:

  • 我没有正则表达式,你能举个例子吗?这一切都必须保留在一个批处理文件中
【解决方案2】:

在 Windows 批处理文件中使用 DOS 进行字符串匹配和正则表达式是一个非常丑陋的 hack。这就像试图用电锯敲钉子一样。你可以做到,但你应该这样做吗?没有。

dos 命令findstr 可以执行有限数量的匹配和正则表达式,如下例所示:

@Echo Off
CD "C:\workspace"
Dir /B>Dir.temp
FindStr /R "[0-9]" "Dir.temp">FindStr.temp
Del Dir.temp
For /F "tokens=*" %%a In (FindStr.temp) Do Call :WorkIt "%%a"
Del FindStr.temp
Exit /B

:WorkIt
:: Insert code here.  Use %1 to get the file name with quotes.  For example:
Echo Found a number in %1
Exit /B
  1. 创建一个名为 C:\workspace 的目录。
  2. 创建一个名为 mybat.bat 的文件并将上面的代码放入其中。
  3. 将两个文件放在 C:\workspace 中,名为 1234.txtabcd.txt
  4. 运行上面的bat文件。
  5. 输出如下:

C:\workspace>mybatch.bat

在“1234.txt”中找到一个号码

DOS FindStr 命令只返回编号为 0 到 9 的文件/文件夹。它省略了abcd.txt 并包含了1234.txt。您可以增加正则表达式的复杂性以仅解析数字,然后将它们转换为整数,然后返回具有最大数字的那个。

【讨论】:

    【解决方案3】:
    for /f %%a in ('dir /b ^|sort /r ^|findstr /r [0-9]') do (
      set "filename=%%a"
      goto done
    )
    :done
    echo the highest found is %filename%
    exit /b 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      相关资源
      最近更新 更多