批处理文件可读取特定属性的值并将其用作变量

时间:2019-06-06 15:37:37

标签: batch-file

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

我有一个带有以下条目的属性文件(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的名称,路径和版本。

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

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

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

2 个答案:

答案 0 :(得分: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行。 / p>

答案 1 :(得分:0)

略有不同的答案,首先检查传递的参数的有效性,而不使用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