如何在powershell中传递字符串常量

我有以下简单的java程序:


import java.util.Arrays;

public class Arguments

{

    public static void main(String [] args)

    {

        System.out.println("args: "+Arrays.toString(args));

    }

}  

当我使用以下命令在powershell中执行此操作时:java Arguments "*.java"程序中收到的字符串不是"*.java"当前目录中所有java文件的逗号分隔列表。如果当前目录中没有 java 文件,则接收到的字符串为"*.java".


我想知道为什么会发生这种情况,以及如何在不转换字符串的情况下传递字符串。


更新:java Arguments '"*".java'并java Arguments `"*.java`"完成了工作,但这在 cmd 中执行时会产生同样的问题。谁能解释为什么会这样?PowerShell和cmd有什么通用的解决方案吗?


largeQ
浏览 112回答 1
1回答

当年话下

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

相关分类

Java