在上一个问题中@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
我正在尝试弄清楚如何使用批处理脚本或其他工具来做到这一点,我感谢您的帮助。
@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
- 使用相同长度的变量名称使它们更容易比较。