【问题标题】:How to pass a string constant as it is in powershell如何在powershell中传递字符串常量
【发布时间】:2019-09-08 22:25:08
【问题描述】:

我有以下简单的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 有什么通用的解决方案吗?

【问题讨论】:

  • 这听起来像java.exe 通配文件,你可以尝试用'*.java' 代替(单引号)
  • 还是和'*.java'一样
  • 您应该使用 -jar 选项运行 jar 文件。像这样:java -jar Arguments "*.java"
  • @epcpu 不能在不创建 jar 文件的情况下运行程序吗?我尝试制作一个并执行它。但它给了我Unable to access jarfile Arguments 错误
  • 您是否尝试过使用重音来转义引号(在每个双引号之前直接添加重音)?

标签: java string powershell arguments


【解决方案1】:

不是PowerShell(也不是cmd.exe)将"*.java"解释为文件名模式并将其扩展(解析)为匹配的文件,称为globbing在 Unix 世界中。

(只有在 类 Unix 平台上的 PowerShell Core 中使用 *.java 时才会出现这种行为 - 即,没有引用 - >,但从不使用 quoted 字符串,例如 "*.java"'*.java',即使在 Windows 上也不使用引号)。

显然,it is legacy versions of java.exe on Windows that automatically perform the globbingunquoted 参数上,显然是在尝试模拟类似 POSIX 的 shell 的行为,例如 Unix 上的 Bash。

  • 从(至少)JDK 12 开始,这种行为似乎不再有效,至少默认情况下不会。

  • 链接的答案表明,在早期版本中,可能是一个控制行为的系统属性,但 不清楚它的名称是什么

    • 一般情况下,java -D<systemPropName>=<value> ... 语法可用于在启动时设置系统属性。

因此,您有以下选择:

  • 升级到不再出现此行为的 Java 版本(默认情况下)。

  • 在旧版本中,找到禁用该行为的相关系统属性名称并使用上面显示的语法。

  • 使用 shell-specific 引用,如下所示。


使用引号防止通配:

为了防止java.exe 执行通配,调用命令行必须最终包含"*.java",即参数必须用双引号括起来

不幸的是,在 PowerShell 和 cmd.exe 中都没有通用语法

cmd.exe

cmd.exe 按原样传递双引号参数,因此以下内容就足够了:

java Arguments "*.java"

PowerShell

相比之下,PowerShell 在后台执行根据需要重新引用(有关详细信息,请参阅this answer)。

由于内容为*.java 的参数在传递给外部程序时通常不需要 需要引用,因此PowerShell 将"*.java"'*.java' 都转换为未引用 *.java 在命令行中最终在幕后使用 - 这就是你所经历的。

有两种解决方法:

  • 使用java Arguments '"*.java"',即嵌入" 字符。在参数中,在文字字符串中 ('...')。

  • 使用java Arguments --% "*.java"--%stop-parsing symbol (PSv3+),它指示 PowerShell 按原样传递命令行的其余部分(扩展 cmd.exe 样式的环境变量引用除外)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2023-04-04
    • 2018-12-07
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多