3

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

双引号无效,其他符号也无效。我尝试使用\'保护输入。但是,这个符号将被添加到我不想要的 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);
}

正则表达式 fromargs[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 \'.???'\ ...

我知道使用引号或反斜杠并不是一个坏主意,但我认为存在更好的方法。

4

2 回答 2

9

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

阻止 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

由于以下 Microsoft 错误,通配符扩展在单个元素类路径的 Windows 命令 shell 中不起作用: http ://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling -破碎

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

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

于 2014-09-20T12:30:56.263 回答
0

除了可能性之外,引用不应扩展的论点,还有另一种可能性。您可以使用命令行参数文件。在那里指定的参数中的通配符不会被扩展。

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

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

于 2022-01-15T15:20:18.247 回答