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

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

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

setting1=Value1
setting2=Value2
...

是否可以像在 Unix shell 脚本中那样读取这些值?可能看起来像这样:

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

我知道这可能可以通过

SET setting1=Value1
实现,但我真的希望所有平台上的设置都具有相同的文件格式。

澄清一下:我需要在命令行/批处理环境中执行此操作,因为我还需要设置无法在 JVM 内更改的参数,例如 -Xmx 或 -classpath。

java windows command-line cmd environment-variables
6个回答
41
投票

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

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

这会读取包含“SETTING1=VALUE1”等字符串的文本文件,并调用 SET 将它们设置为环境变量。

setlocal/endlocal 用于将环境变量的范围限制为批处理文件的执行。

CMD 命令处理器实际上非常强大,尽管其语法相当复杂。


2
投票

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


2
投票

这个单行代码在将值分配给变量之前也会取消引号:

for /F "delims== tokens=1,* eol=#" %%i in (%filename%) do set %%i=%%~j
  • delims==
    =
    字符
  • 分割行
  • tokens=1,*
    将第一个标记(名称)放入
    %%i
    中,将其余的(值)放入
    %%j
  • eol=#
    跳过以
    #
    开头的行(评论)
  • %%~j
    从值中删除周围的引号

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

这将执行以下操作:

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

如果您想将变量读取为数字,请在 .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

1
投票

仅从属性文件中导入特定变量(您提前知道的变量)可能是明智的,在这种情况下,我建议使用如下所示的函数:

: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


0
投票

您还可以从 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));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.