Пакетный файл для чтения значения определенного свойства и использования его в качестве переменной - PullRequest
0 голосов
/ 06 июня 2019

Я пишу пакетный сценарий для чтения значений свойства, которое передается в качестве аргумента пакетному сценарию во время выполнения.

У меня есть файл свойств (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, чтобы иметь возможность читать NAME, PATH и VERSION 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 ]

1 голос
/ 06 июня 2019

Вы не назначаете ни одной переменной в своем коде, хотя пытаетесь ее вернуть.

Можно использовать следующий код, который ищет в файле 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.

0 голосов
/ 06 июня 2019

Немного другой ответ, сначала проверяя переданный аргумент на достоверность и не используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...