Извлечь значение переменной из файла скрипта в 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!
Другие вопросы по тегам