【问题标题】:Batch File to read value of a specific property and use it as a variable批处理文件读取特定属性的值并将其用作变量
【发布时间】:2019-06-06 15:37:37
【问题描述】:

我正在编写一个批处理脚本来读取属性的值,该属性在执行期间作为参数传递给批处理脚本。

我有一个包含以下条目的属性文件 (Input.properties)。

APP1_NAME=common1
APP1_PATH=path1\val\test
APP1_VERSION=1.0
APP2_NAME=common2
APP2_PATH=path2\val\test
APP2_VERSION=2.0
APP3_NAME=common3
APP3_PATH=path3\val\test
APP3_VERSION=3.0

我有一个批处理 (Read.bat) 脚本,其中 ${APP} 传递了一个参数,其值为 3 APP1/APP2/APP3。我正在尝试根据传递的值读取特定属性的值并将其存储在变量中并进一步使用它。假设我们将 APP1 传递给 Read.bat,我们应该能够读取 APP1 的 NAME、PATH 和 VERSION。

如果我想通过传递静态属性来读取一个值,我尝试了下面的方法,但是如果属性名称的一部分作为变量值传递,我正在寻找一些方法。

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,* delims== " %%i in (Input.properties) do (
echo %APP1_NAME%
)   

如果我们将 APP2 作为参数传递给 Read.bat 我们应该能够读取 APP2_NAME 的值并将其存储在变量中,并读取 APP2_PATH 的值并将其存储在另一个变量中以供进一步使用。

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    尽管您尝试返回一个变量,但您并没有在代码中分配一个变量。

    您可以使用以下代码,它在文件Input.properties 中搜索以作为命令行参数给出的字符串后跟下划线 (_) 的字符串开头的行,并分配所有相应的匹配变量:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    (
        for /F "tokens=1* delims==" %%I in ('findstr /IBC:"%~1_" "Input.properties"') do (
            set "%%I=%%J"
        )
    ) || (>&2 echo No items found! & exit /B 1)
    set "%~1_"
    
    endlocal
    exit /B
    

    请注意,在endlocal 命令之后变量不再可用,因此如果您在上述代码运行后需要变量,则需要删除setlocalendlocal 行。

    【讨论】:

    • 嗨 aschipfl 我已经运行了下面的脚本是输出: APP2_NAME=common2 APP2_PATH=path2\val\test APP2_VERSION=2.0 。我真的很想获取 APP2_NAME 值,而不是如上所示。
    • 如果在我的脚本运行后变量仍然需要存在,您需要删除 setlocalendlocal 行...
    【解决方案2】:

    答案略有不同,首先检查传递的参数是否有效,而不是使用 setlocal:

    :: Q:\Test\2019\06\06\SO_56480912.cmd
    @Echo off
    Echo:%~1|findstr /ix "APP[1-3]" >Nul ||(Echo wrong arg %1 &Pause&exit /B 1)
    for /f "delims=" %%A in ('findstr /I "^%~1_" input.properties') do set "%%A"
    set %~1
    

    > Q:\Test\2019\06\06\SO_56480912.cmd apP2
    APP2_NAME=common2
    APP2_PATH=path2\val\test
    APP2_VERSION=2.0
    
    > Q:\Test\2019\06\06\SO_56480912.cmd apP4
    wrong arg apP4
    

    【讨论】:

    • 嗨 LotPings,我需要将 APP2_NAME 属性的值抓取到一个变量中并进一步使用它而不显示 findstr 输出。
    • 最后一个Set %~1 只是输出正在设置的变量(并准备与%APP2_NAME% 一起使用),第一个findstr 用于检查有效参数。
    猜你喜欢
    • 2022-09-30
    • 2014-04-14
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多