1 回答
TA贡献1890条经验 获得超9个赞
不是PowerShell (nor )将cmd.exe
其解释为文件名模式并将其扩展(解析)为匹配的文件,这在 Unix 世界中"*.java"
称为globbing 。
(如果您在类 Unix 平台上的 PowerShell Core*.java
中使用- 即不引用- ,但永远不会使用带引号的字符串(例如or ,甚至在Windows上不引用 never ) ,您只会得到这种行为。"*.java"
'*.java'
显然,Windows 上的旧版本java.exe
会自动对未引用的参数执行 globbing ,显然是在尝试模拟 POSIX 类 shell 的行为,例如 Unix 上的 Bash。
从(至少)JDK 12 开始,这种行为似乎不再有效,至少默认情况下不会。
链接的答案表明,在早期版本中,可能有一个控制行为的系统属性,但不清楚它的名称是什么。
通常,该语法
java -D<systemPropName>=<value> ...
可用于在启动时设置系统属性。
因此,您有以下选择:
升级到不再出现此行为的 Java 版本(默认情况下)。
在旧版本中,找到禁用该行为的相关系统属性名称并使用上面显示的语法。
使用特定于 shell 的引用,如下所示。
使用引用来防止通配符:
为了防止java.exe
执行通配,调用命令行必须最终包含"*.java"
,即,参数必须用双引号引起来。
不幸的是,没有通用的语法适用于 PowerShell 和cmd.exe
:
cmd.exe
:
cmd.exe
按原样传递双引号参数,因此以下内容就足够了:
java Arguments "*.java"
电源:
相比之下,PowerShell在后台根据需要执行重新引用(有关更多信息,请参阅此答案)。
由于带有内容的参数在传递给外部程序时*.java
通常不需要引用,因此PowerShell会在最终在幕后使用的命令行中将"*.java"
两者转换'*.java'
为未引用 *.java
- 这就是您所经历的。
有两种解决方法:
使用
java Arguments '"*.java"'
,即嵌入"
字符。在参数中,在文字字符串 ('...'
) 内。使用
java Arguments --% "*.java"
;--%
是停止解析符号(PSv3+),它指示 PowerShell 按原样传递命令行的其余部分(扩展cmd.exe
-style 环境变量引用除外)。
添加回答
举报