如何解析 JVM 命令行以使用 Windows 批处理脚本添加其他开关

问题描述 投票:0回答:1

在上一个问题中@Magoo的帮助下,我可以编写一个批处理脚本来解析具有键/值对的文本文件并将键加载为环境变量。以下是脚本:

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
rem This script ready text file and parses key/value pairs and loads the keys and their values as environment variables

SET "configfile=.\testconfigfile.txt"

:: remove variables starting count_
FOR  /F "delims==" %%e In ('set count_ 2^>Nul') DO SET "%%e="

FOR /f "usebackq tokens=1* delims==" %%b IN ("%configfile%") DO (
 IF "%%c" neq "" (
  set keyname=%%b
  echo Key Name = !keyname!
  if "!keyname:~-4!"=="_arr" (
    IF DEFINED count_%%b (SET /a count_%%b+=1) ELSE (SET /a count_%%b=0)
    SET "!keyname![!count_%%b!]=%%c"
  ) else (
    SET "!keyname!=%%c"
  )
 )
)
SET count
SET |FIND "["
SET do_
SET delete_

GOTO :EOF

现在我有一个批处理脚本

apply_jvm_changes.bat
,它必须解析用于启动 Java 程序的 Java 命令行并添加其他 JVM 开关。

要更新的批处理脚本如下所示:

%JRE_HOME%\bin\java.exe -Xbootclasspath/p:path1;path2; -classpath path1;path2; -Dswitch1 -Dswitch2 -Dhttps.protocol="TLSv1.2" -Dswitch3 -DswitchN com.main.class 

我想解析该文件并通过添加

-Djavax.net.ssl.trustStore="path\to\cacerts" -Djavax.net.ssl.trustStorePassword=changeit
来更新它,如下所示:

%JRE_HOME%\bin\java.exe -Xbootclasspath/p:path1;path2; -classpath path1;path2; -Dswitch1 -Dswitch2 -Dhttps.protocol="TLSv1.2" -Dswitch3 -DswitchN -Djavax.net.ssl.trustStore="path\to\cacerts" -Djavax.net.ssl.trustStorePassword=changeit com.main.class

我正在尝试弄清楚如何使用批处理脚本或其他工具来做到这一点,我感谢您的帮助。

windows parsing jvm-arguments
1个回答
0
投票
@ECHO OFF
SETLOCAL

SET "jre_home=wherever"

SET "original=%%JRE_HOME%%\bin\java.exe -Xbootclasspath/p:path1;path2; -classpath path1;path2; -Dswitch1 -Dswitch2 -Dhttps.protocol="TLSv1.2" -Dswitch3 -DswitchN com.main.class"
SET "addition=-Djavax.net.ssl.trustStore="path\to\cacerts" -Djavax.net.ssl.trustStorePassword=changeit"

FOR %%e IN (%original%) DO SET "before=%%e"
CALL SET "finalxxx=%%original:%before%=%addition% %before%%%"

SET original
SET finalxxx

GOTO :EOF

没有足够的信息来提供正确的答案 - 我做了一些假设。

首先,我没有变量

jre_home
,所以我简单地分配了一个。

接下来,没有任何迹象表明字符串是固定的还是可能包含

poison characters
(那些对批处理具有特殊含义的字符,可能会导致意外结果。)
%
是这些字符之一。为了保留
%
值中的
original
,需要通过额外的
%
“转义”。

没有说明插入点的公式是什么。我假设新字符串将插入到

original
字符串的最后一个标记之前。

因此 - 找到最后一个字符串(假设是唯一的)为

before
,然后用addition+thestring 替换该字符串。这使用
call set "var1=%%var2:%string1%=%string2%%%"
语法。为了让这一点更加明显,涉及的元素是
call set "var1=%%var2: %string1% = %string2% %%"
,它在子 shell 中执行
set "var1=%var2: string1 = string2 %"

然后显示

original
finalxxx
- 使用相同长度的变量名称使它们更容易比较。

© www.soinside.com 2019 - 2024. All rights reserved.