java - 停止将命令行参数中的通配符扩展到 Java

标签 java shell cmd wildcard-expansion

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

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

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 \'.???'\ ...

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

最佳答案

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

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


现在是 Windows 案例……这才是您真正要问的问题。

据我所知,标准的“cmd.exe”shell(在其各种版本/风格中)不进行通配符扩展。由应用程序在临时基础上进行(或不进行)扩展。

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

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

但如果这没有帮助,您可能就不走运了。


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

Java Wildcard expansion on Windows platform has been documented. See the following links:

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

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

Wildcard expansion does not work in a Windows command shell for a single element classpath due to the Microsoft bug described in: http://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling-broken.

The limitations are also mentioned in 7u10 release notes: http://www.oracle.com/technetwork/java/javase/7u10-relnotes-1880995.html

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

关于java - 停止将命令行参数中的通配符扩展到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948706/

相关文章:

java - 为什么需要java中的接口(interface)?

shell - 从 localhost 授予对 root 的访问权限

linux - Unix - 创建文件夹和文件的路径

batch-file - CMD - 将文件从多个文件夹复制到一个文件夹

c - 如何在 C 中处理命令行参数?

python - 将特殊字符传递给 cmd.exe 中的 python 脚本

java - Android 数据库应用程序在模拟器上运行良好,但在设备上出现错误

java - JPanel.getWidth() 不准确。为什么?

java - 你能帮我合并几个 map 的值吗?

javascript - 使用javascript的mongodb shell中的变量集合名称