我正在编写一个批处理脚本,以读取在执行期间作为批处理脚本的参数传递的属性值。
我有一个带有以下条目的属性文件(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的值并将其存储另一个变量以供将来使用。
答案 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
命令之后变量不再可用,因此,如果在上述代码运行后需要变量,则需要删除setlocal
和endlocal
行。 / 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