【问题标题】:java commandline argument processing on windowswindows上的java命令行参数处理
【发布时间】:2021-02-13 17:56:35
【问题描述】:

我有一个 java 程序,想将一些文件路径作为命令行参数传递。 如果它们包含空格,我必须引用它们。这适用于 Linux 和 Windows。 但是在 Windows 上,如果路径包含斜杠,我会遇到问题。

为了测试这一点,我编写了一个简单的Echo.java 程序。

所以,如果我说:

java -cp 。 "C:\Program Files\" "C:\Other Files"

[C:\Program Files" C:\Other]
[Files]

那么,这里发生了什么?反斜杠似乎逃脱了引用。 对于 Linux,这没问题,但这是在 Windows 上!

但即使这样:

设置 PF="C:\Program Files\"

java -cp 。 "%PF%" "C:\其他文件"

[C:\Program Files" C:\Other]
[Files]

没有斜杠,它可以按预期工作:

java -cp 。 "C:\Program 文件" "C:\其他文件"

[C:\Program Files]
[C:\Other Files]

【问题讨论】:

  • 更正:我使用 set PF=C:\Program Files\ 不带引号。添加引号会使情况变得更糟。
  • 另一个错字:java -cp。 Echo "C:\Program Files\" "C:\Other Files"
  • 目录路径不也不应该以尾部反斜杠 \ 结尾。反斜杠是一个路径分隔符,如果没有什么要分隔的,你不应该使用它,将路径更改为"C:\Program Files",你已经为"C:\Other Files"做了那个,所以我不确定你为什么有那个反正不一致。此外,您不应该使用硬编码的双引号来定义变量,您应该使用Set "PF=C:\Program Files"。此外,如果您的路径确实如此,那么为什么还要定义一个变量,%ProgramFiles% 已经存在于相关路径中。
  • 只需将. 附加到目录路径,就不必担心尾随反斜杠;即使原始路径没有尾部反斜杠,这也有效,不会改变其目标......

标签: java batch-file command-line-arguments


【解决方案1】:

如果您使用路径来检索文件,为什么不使用正斜杠。它应该工作。例如:

java -cp . "C:/Program Files/" "C:/Other Files"

【讨论】:

  • 当然,您可以轻松避免它,但路径值是由另一个批处理文件使用 %~p1 等表达式生成的。但我刚刚发现提示:ss64.com/nt/syntax-args.html
【解决方案2】:

尝试使用双斜杠 C:\Program Files\" 来转义斜杠 \ (slash-slash-quote)。 甚至这里的文本编辑器也逃脱了斜线引用

【讨论】:

  • 我的主要问题不是如何解决(即使这也有帮助)。相反,我感兴趣的是:为什么会发生这种情况?
【解决方案3】:

由于您的问题似乎是带有尾部反斜杠的位置是变量扩展的结果,%~dp1,处理该问题的最简单方法是运行命令以删除该默认尾部字符。

示例:10 行是重要部分)

@Echo Off
SetLocal EnableExtensions
Call :Sub "C:\Program Files\Windows NT"
Pause
GoTo :EOF

:Sub
Echo %%1 = %1
Echo %%~dp1 = %~dp1
For %%G In ("%~dp1.") Do Set "PF=%%~fG"
Echo {%PF%}
Exit /B

【讨论】:

    【解决方案4】:

    有一个可能的解决方案:

    设置 PF=C:\Program Files\

    java -cp 。 echo "%PF:\=/%" "C:\Other Files"

    [C:/Program Files/]
    [C:\Other Files"]
    

    但我的主要问题是:为什么会发生这种情况?

    原因是:在 Windows 上,将命令行拆分为参数必须由可执行文件本身执行(与 Unix 不同)。 Java7 引入了其own version 的命令行拆分,其行为不同。与 MS setargv.obj 解决方案相比,它引入了反斜杠作为转义字符。

    另见:JDK-8031408

    【讨论】:

      猜你喜欢
      • 2013-02-18
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多