Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java类路径中的转义通配符处理_Java_Windows_Shell_Cmd - Fatal编程技术网

java类路径中的转义通配符处理

java类路径中的转义通配符处理,java,windows,shell,cmd,Java,Windows,Shell,Cmd,由于通配符处理,下一个代码将打印当前目录中每个文件的属性 c:\work>attrib * 我需要在脚本中禁用通配符处理。转义符号不起作用: c:\work>attrib "*" c:\work>attrib ^* 两者都给你相同的答案 我需要禁用通配符处理来启动接受通配符作为参数的应用程序 A.java import java.util.Arrays; public class A { public static void main(String[] args

由于通配符处理,下一个代码将打印当前目录中每个文件的属性

c:\work>attrib *
我需要在脚本中禁用通配符处理。转义符号不起作用:

c:\work>attrib "*"
c:\work>attrib ^*
两者都给你相同的答案

我需要禁用通配符处理来启动接受通配符作为参数的应用程序

A.java

import java.util.Arrays;

public class A {

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString(args));
    }
}
指令


找到了解决办法。“*;”-不是falid文件夹名称,而是有效的类路径:

java -cp "*;" A

谢谢。

正如伊格纳西奥·巴斯克斯·艾布拉姆斯(Ignacio Vazquez Abrams)已经指出的那样,在Windows上,shell不进行通配符扩展。这取决于应用程序。因此,您无法对shell执行任何操作来阻止它执行它在一开始就不执行的操作

> echoargs.exe *
arg 1: *
因此,如果应用程序中的参数被破坏了,那么肯定不是shell的错

编辑:显然Java“有益地”复制了Unix行为并为您扩展了所有通配符。上面的
echoargs
是用C#编写的,这就是问题没有出现的原因

好的,从2004年开始进一步挖掘。这是因为Java与另一个版本的
setargv
链接,如前所述,因此扩展了命令行参数中的通配符。这发生在Java看到参数之前,因为这是C运行时启动代码


此外,据我所知,这并没有记录在任何地方,上面链接的bug 5036373甚至指出应该记录它。显然,没有解决办法。即使这使得无法向Java程序传递文本通配符。显然,Windows实际上只是Java的第二类目标,他们并不关心(或者它会破坏太多程序,但我不确定是否有那么多程序明确依赖这种行为)。

正如Ignacio Vazquez Abrams已经指出的,在Windows上,shell不会进行通配符扩展。这取决于应用程序。因此,您无法对shell执行任何操作来阻止它执行它在一开始就不执行的操作

> echoargs.exe *
arg 1: *
因此,如果应用程序中的参数被破坏了,那么肯定不是shell的错

编辑:显然Java“有益地”复制了Unix行为并为您扩展了所有通配符。上面的
echoargs
是用C#编写的,这就是问题没有出现的原因

好的,从2004年开始进一步挖掘。这是因为Java与另一个版本的
setargv
链接,如前所述,因此扩展了命令行参数中的通配符。这发生在Java看到参数之前,因为这是C运行时启动代码


此外,据我所知,这并没有记录在任何地方,上面链接的bug 5036373甚至指出应该记录它。显然,没有解决办法。即使这使得无法向Java程序传递文本通配符。显然,Windows实际上只是Java的二等目标,他们并不在意(或者它会破坏太多程序,但我不确定是否有那么多程序明确依赖这种行为)。

但是。。。在Windows下,shell不负责通配符扩展…你是说在Windows shell脚本中禁用通配符处理是不可行的吗?我同意Ignacio。你有没有尝试过创建一个简单的控制台应用程序,传入一个*并在args中检查它?我的意思是,这不是必要的,因为它一开始从不处理它们。它会破坏我的应用程序的参数,我需要禁用它,但是。。。在Windows下,shell不负责通配符扩展…你是说在Windows shell脚本中禁用通配符处理是不可行的吗?我同意Ignacio。您是否尝试过创建一个简单的控制台应用程序,传入*并在args中检查它?我的意思是,这不是必需的,因为它从一开始就不会处理它们。它会破坏我的应用程序的参数。我需要禁用它,因为“*foo?*bar*”不是有效的文件夹名称,请尝试single*参见编辑。外壳不是故障,Windows也不是。它是Java。(这是三个参数,第一个是星号。)你能用single*作为参数显示你的应用程序的autput吗。我告诉过你,shell不支持通配符扩展,默认情况下Windows的任何其他部分也不支持,除了那些通过设计实现的函数(例如,
FindFirstFile
)。它也不是Java,因为类路径中的通配符是重要的、计算良好的功能,并且在unix中正常工作。用户在windows中会遇到问题,因为“*foo?*bar*”不是有效的文件夹名称,请尝试使用single*查看编辑。外壳不是故障,Windows也不是。它是Java。(这是三个参数,第一个是星号。)你能用single*作为参数显示你的应用程序的autput吗。我告诉过你,shell不支持通配符扩展,默认情况下Windows的任何其他部分也不支持,除了那些通过设计实现的函数(例如,
FindFirstFile
)。它也不是Java,因为类路径中的通配符是重要的、计算良好的功能,并且在unix中正常工作。用户在windows中面临问题