Извлечь значение переменной из файла скрипта в Install Anywhere
Я использую Install Anywhere 2012 и хотел бы иметь возможность проанализировать пакетный сценарий или сценарий оболочки для заданного значения и сохранить это значение в переменной IA. Например, если у меня есть следующий файл оболочки:
MY_VAR1=123
MY_VAR2=a\b\c
ECHO $MY_VAR1
Я хотел бы передать путь к файлу и имя переменной (например, MY_VAR1) и получить результат, 123, сохраненный в переменной IA по моему выбору (скажем, $OUTPUT$). Я мог бы достичь этого, написав некоторый пользовательский код на Java, но мне было интересно, есть ли альтернативный подход, встроенный в IA, который бы облегчил это. Переменная не будет инициализирована, когда мне нужно выяснить ее значение, так что просто повторение ее значения или чего-то подобного не будет работать. Любая помощь будет принята с благодарностью!
3 ответа
В Linux/Unix вы можете использовать perl или awk (обе являются стандартными утилитами в большинстве дистрибутивов). Python или Ruby также являются кандидатами, но не могут быть установлены в вашей целевой системе. Вы даже можете написать свой собственный целевой анализатор, используя Lex и Yacc, и отправить его вместе с установщиком. Тем не менее, для ваших нужд это, безусловно, излишне.
Вот пример возможного решения awk в Action Execution Script/Batch File Action:
#!/bin/bash
awk '
# Process lines that begin with our variable name,
# preceded by optional spaces or tabs.
/^[ \t]*$TARGET_VARIABLE_NAME$=.+/ {
# Split the current line on "=" into
# an array called result
split($0, result, "=")
value = result[1]
# Look for trailing comments and remove them.
offset = index(value, "#")
if (offset > 0) {
value = substr(value, 1, offset - 1)
}
# Remove any possible leading spaces and quotes.
# Note that the single-quote is escaped. That escape
# is for bash, not for awk. I am doing this from
# memory and do not have access to IA right now.
# you may have to play with the escaping.
gsub(/^[\'" ]*/, "", value)
# Remove any possible trailing spaces and quotes.
# See above regarding the escaped single-quote.
gsub(/[\'" ]*$/, "", value)
# send "value" to stdout
print value
}
' < $SHELL_INPUT_FILE$
print value
линия (ближе к концу) отправляет value
на стандартный вывод
В настройках "Выполнить действие сценария / пакетного файла" можно указать переменные, которые получают потоки stdout и stderr, созданные действием сценария. По умолчанию поток stdout хранится в $EXECUTE_STDOUT$
, Вы можете изменить это имя переменной по вашему выбору.
В приведенном выше примере $TARGET_VARIABLE_NAME$
а также $SHELL_INPUT_FILE$
переменные InstallAnywhere, которые содержат имя переменной для поиска и имя файла для анализа, соответственно. Эти переменные будут заменены их значениями перед выполнением действия.
Предположим, у нас есть скрипт с именем /home/fred/hello.sh
, который содержит следующий код:
#!/bin/bash
WIFE='Wilma'
NEIGHBOR="Barney Rubble"
echo "Hello to $WIFE and $NEIGHBOR from $PWD"
Перед выполнением действия "Выполнить сценарий / пакетный файл" введите имя файла сценария в $SHELL_INPUT_FILE$
(/home/fred/hello.sh
). Затем установите значение $TARGET_VARIABLE_NAME$
к переменной, которую вы хотите найти (скажем, NEIGHBOR
). После того, как действие завершено, $EXECUTE_STDOUT$
в InstallAnywhere будет содержать Barney Rubble
,
Вы можете использовать эту идею для разбора произвольно сложных файлов в действии "Выполнение сценария / Пакетный файл". Просто сделайте ваш awk (или perl/Ruby/Python) скрипт настолько сложным, насколько это необходимо.
ПРИМЕЧАНИЕ: при написании сценариев сценариев оболочки Unix в InstallAnywhere ВСЕГДА проверяйте параметр "Не заменять неизвестные переменные". Если вы этого не сделаете, InstallAnywhere тихо преобразует все, что выглядит как переменная InstallAnywhere в пробелы... Это очень раздражает.
Для решения Windows найдите автономную версию Windows на awk или perl и включите ее в свою установку. Затем расширьте вышеупомянутое решение для работы с пакетными файлами.
Вы хотите создать два действия "Выполнить сценарий / пакетный файл", одно с правилом для Linux/Unix, а другое с правилом для Windows. Вы должны были установить исполняемый файл Windows awk или perl, прежде чем вызывать это действие. Кроме того, вам необходимо полностью указать путь к исполняемому файлу awk/perl. Наконец, фактический сценарий должен быть чувствительным к различиям в синтаксисе пакета и синтаксиса оболочки.
Ниже приведен скрипт awk, модифицированный для поиска определений пакетных переменных. Шаблон меняется, и вам не придется беспокоиться о встроенных комментариях:
$PATH_TO_AWK_EXE$ '
# This pattern looks for optional spaces, the word SET
# with any capitalization, the target variable, more
# optional spaces and the equals sign.
/^[ \t]*[Ss][Ee][Tt][ \t]*$TARGET_VARIABLE_NAME$[ \t]*=.+/ {
# Split the current line on "=" into
# an array called result
split($0, result, "=")
value = result[1]
# No trailing comments in Batch files.
# Remove any possible leading spaces and quotes.
# Note that the single-quote is escaped. That escape
# is for bash, not for awk. I am doing this from
# memory and do not have access to IA right now.
# you may have to play with the escaping.
gsub(/^[\'" ]*/, "", value)
# Remove any possible trailing spaces and quotes.
# See above regarding the escaped single-quote.
gsub(/[\'" ]*$/, "", value)
# send "value" to stdout
print value
}
' < $SHELL_INPUT_FILE$
Выше, переменная IA $PATH_TO_AWK_EXE$
указывает на место, где был установлен awk. Это будет установлено как некоторая комбинация $USER_INSTALL_FOLDER$, возможно, других имен каталогов и имени файла awk.exe. $PATH_TO_AWK_EXE$
позже может быть использован для удаления исполняемого файла awk, если это необходимо.
Вы можете попытаться получить переменную из вывода скрипта
"Выполнить скрипт" -> Сохранить стандартный вывод процесса в: $EXECUTE_OUTPUT$
После этого вы можете использовать $ EXECUTE_OUTPUT $ в качестве переменной
Пример в пакете Windows:
@echo off &setlocal
for /f "tokens=2delims==" %%a in ('findstr "MY_VAR1" "ShellFile"') do set "output=%%a"
if defined output (echo MY_VAR1: %output%) else echo MY_VAR1 not found!