从Windows批处理(cmd.exe)中的文件读取环境变量

n3h0vuf2  于 2023-02-25  发布在  Windows
关注(0)|答案(6)|浏览(312)

我正在尝试从一个批处理文件中读取变量,以便稍后在批处理脚本中使用,这是一个Java启动程序。我希望所有平台(Unix、Windows)上的设置文件都具有相同的格式,并且是一个有效的Java属性文件。也就是说,它应该如下所示:

setting1=Value1
setting2=Value2
...

有没有可能像在Unix shell脚本中那样读取这些值呢?应该看起来像这样:

READ settingsfile.xy
java -Dsetting1=%setting1% ...

我知道这在SET setting1=Value1中是可能的,但是我真的希望所有平台上的设置都使用相同的文件格式。
澄清一下:我需要在命令行/批处理环境中执行此操作,因为我还需要设置不能从JVM中更改的参数,如-Xmx或-classpath。

ctrmrzij

ctrmrzij1#

您可以在批处理文件中执行此操作,如下所示:

setlocal
FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i
java -Dsetting1=%setting1% ...
endlocal

它读取包含类似“SETTING 1 = VALUE 1”的字符串的文本文件,并调用SET将它们设置为环境变量。
setlocal/endlocal用于将环境变量的作用域限制在批处理文件的执行范围内。
CMD命令处理器实际上是相当强大的,虽然有一个相当拜占庭式的语法。

xdyibdwo

xdyibdwo2#

您可以将属性文件作为一个参数传递给Java程序(该程序稍后可能会启动主程序),然后受益于多平台范例。

zbq4xfa0

zbq4xfa03#

只从属性文件中导入特定的变量(你提前知道的)可能是明智的,在这种情况下,我推荐一个如下所示的函数:

:parsePropertiesFile
    set PROPS_FILE=%1
    shift
    :propLoop
    if "%1"=="" goto:eof
    FOR /F "tokens=*" %%i in ('type %PROPS_FILE% ^| findStr.exe "%1="') do SET %%i
    shift
    GOTO propLoop
goto:eof

它将由call:parsePropertiesFile props.properties setting1 setting2调用以设置变量setting1和setting2

jogvjijk

jogvjijk4#

这将执行以下操作:

  • 跳过所有以#开头的行(可用于注解)
  • 读取批处理脚本所在目录中的文件.env,并将行传递给SET

剧本

FOR /F "eol=# tokens=*" %%i IN (%~dp0.env) DO SET %%i

如果您想将变量读取为数字,请在.env文件中的变量行前面加上/A标志
即:/A PORT=1215

为了更有帮助,这是我正在分析的.env文件

# The name of the mariadb service to be installed
MariaDb_serviceName=Swoole_MariaDB
# which port the mariadb server will run at
# notice i added /A flag so that the SET command stores the variable as a number
/A MariaDb_port=1214
# password of mariadb root user
MariaDb_rootPassword=
# Database to be created after installing mariadb
MariaDb_createDataBase=data
# the server service name to be installed
Server_serviceName=Swoole_Server
monwx1rj

monwx1rj5#

您还可以从Java程序中访问操作系统的环境变量:

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n", envName, env.get(envName));
        }
    }
}
mjqavswn

mjqavswn6#

这一行程序还在将value赋值给变量之前取消其引号:

for /F "delims== tokens=1,* eol=#" %%i in (%filename%) do set %%i=%%~j
  • delims===字符拆分行
  • tokens=1,*将第一个令牌(名称)放入%%i,将其余令牌(值)放入%%j
  • eol=#跳过以#开头的行(注解)
  • %%~jremove surrounding quotes起始值

相关问题