java - 通过 CMD 与 Powershell 执行 Java 命令时的差异 - 由句点 ("."引起)

标签 java windows powershell batch-file cmd

我有一个示例 Java 应用程序,需要在某些环境中指定 HTTP 代理。

当我尝试使用Oracle website上建议的参数来运行它时在 CMD(命令提示符)中它工作正常。

E:\>java -Dhttp.proxyHost=http://proxy.example.com -jar myJAR.jar
System properties...
[...]
http.proxyHost=http://proxy.example.com

您可以看到应用程序已运行,并且在列出系统属性时,它正确收到了 http.proxyHost属性。

但是,当我从 Powershell 运行此命令时,我得到以下信息:

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS E:\> java -Dhttp.proxyHost=http://proxy.example.com -jar myJAR.jar
Error: Could not find or load main class .proxyHost=http:..proxy.example.com

这里似乎第一个“.”周围发生了某种破坏。从那时起,它将其余部分视为另一个论点。

如果参数被引用 - 例如-D"http.proxyHost"=http://proxy.example.com - 然后在 Powershell 中就可以正常工作了。

谁能解释一下这种行为吗?

最佳答案

不幸的是,您在 PowerShell 中发现了一个错误,该错误至少存在于 v7.3.6(撰写本文时为当前版本):

看起来像 PowerShell 参数的东西在 .(句点)处被分成两个 参数 - 即使参数应该简单被传递,假设调用了外部程序 - 请参阅 GitHub issue #6291 ;在您的情况下, -Dhttp.proxyHost=http://proxy.example.com 意外地传递为
-Dhttp .proxyHost=http://proxy.example.com(注意.之前的空格)

解决方法:

  • ` - 转义初始 - (或单独引用 . 字符('.')或引用整个参数):

    java `-Dhttp.proxyHost=http://proxy.example.com -jar myJAR.jar
    
  • 或者,如Sergey Shu's answer所示,使用 --%stop-parsing symbol ,强制 PowerShell 传递所有参数,而不应用 PowerShell 的常用解析规则。

    • 警告:使用 --% 会产生重大副作用,特别是无法使用变量引用在命令中并且无法应用重定向 - 请参阅 this answer了解详情。

关于java - 通过 CMD 与 Powershell 执行 Java 命令时的差异 - 由句点 ("."引起),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60487766/

相关文章:

java - Hadoop返回mapper而不是reducer的输出

java - Spring @ModelAttribute 和翻译请求参数绑定(bind)名称

c++ - 您如何试用小型/简单的 C 或 C++ 源代码?

windows - 如何正确转义Windows批处理文件中的括号?

c++ - 只有逐步调试,代码才能正常运行

powershell - 如何从树中删除所有隐藏的不需要的目录?

java - 如何在postExecute中定义全局变量?

java - Android Master/Detail 流程 - 在 Activity 中操作 Detail fragment View

powershell - 如何跨 Azure Functions 共享 Powershell psm1

powershell - 带排除的移动项目不起作用