为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2022-10-12 15:51:48
我有以下简单的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有什么通用的解决方案吗?
查看完整描述

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 环境变量引用除外)。


查看完整回答
反对 回复 2022-10-12
  • 1 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信