【问题标题】:Stop expanding wildcard symbols in command line arguments to Java停止将命令行参数中的通配符扩展至 Java
【发布时间】:2014-09-20 12:21:50
【问题描述】:

我的程序必须监视匹配掩码的文件。文件夹名称和掩码通过命令行参数传递。但是掩码在我可以使用之前被第一个匹配替换了!

双引号无效,其他符号也一样。我尝试使用\' 来保护输入。但是,这个符号将被添加到我不想要的 args 中。知道如何解决它吗?

public static void main(String[] args) throws IOException {
    File dir = new File(args[0]);
    String mask = args[1];
    System.out.println(dir.getAbsolutePath());
    System.out.println(mask);
    String regex = args[2];
    System.out.println(regex);
}

args[2] 中的正则表达式也替换为文件夹中的某些文件。

Input: "E:\Programming\Java\Task7" *.??? ...
Ouput: E:\Programming\Java\Task7 .git Task7.iml

Input: "E:\Programming\Java\Task7" *.????* [a-zA-Z]
Output: E:\Programming\Java\Task7 .idea [a-zA-Z]

Input: "E:\Programming\Java\Task7" '.???' ...
Output: E:\Programming\Java\Task7 '.???' ...

Input: "E:\Programming\Java\Task7" \\'.???'\\ ...
Output: E:\Programming\Java\Task7 \'.???'\ ...

我知道使用引号或反斜杠并不是什么坏主意,但我认为还有更好的方法。

【问题讨论】:

    标签: java shell cmd wildcard-expansion


    【解决方案1】:

    背景:在 Linux 上,扩展命令参数中的通配符的不是 Java。 java 命令启动之前,shell 会执行此操作

    阻止 shell 扩展通配符的方法是引用参数。如何执行此操作取决于您使用的 shell。


    现在对于 Windows 案例...这是您真正要问的问题。

    根据我的阅读,标准的“cmd.exe”外壳(在其各种版本/风格中)不进行通配符扩展。由应用程序自行扩展(或不扩展)。

    显然,这对于 Java “一次编写,到处运行”的理念来说是有问题的,因此 Java 设计者试图让命令行参数中的通配符在 Windows 上像在 Unix 和 Linux 上一样工作。但不幸的是,他们无法做到完美……因此出现了这种异常情况。

    然而,根据this page,在参数周围加上双引号会告诉Java不要进行通配符扩展。

    但如果这没有帮助,你可能不走运。


    以下是有关此主题的 Oracle 文档的一些链接,取自 Oracle Java 错误报告 #5036373

    Windows 平台上的 Java 通配符扩展已记录在案。看 以下链接:

    http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

    http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

    通配符扩展在 Windows 命令 shell 中不能用于 由于 Microsoft 错误,单元素类路径如下所述: http://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling-broken.

    7u10 发行说明中也提到了这些限制: http://www.oracle.com/technetwork/java/javase/7u10-relnotes-1880995.html

    但是,我认为写这篇文章的 Oracle 员工是故意迟钝,因为通配符扩展通常显然没有记录在那些“手册”页面中。他们只在-cp 参数中谈论通配符扩展。

    【讨论】:

      【解决方案2】:

      除了可能,引用不应扩展的论点,还有另一种可能。您可以使用命令行参数文件。此处指定的参数中的通配符不展开。

      至少,这里是这样描述的:https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-4856361B-8BFD-4964-AE84-121F5F6CF111。 请参阅“java命令行参数文件”部分。

      启动器不会扩展参数文件中存在的通配符。

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 1970-01-01
        • 2022-01-10
        • 2012-02-29
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多