从Install Anywhere中的脚本文件中提取变量的值

时间:2013-09-18 15:55:46

标签: linux shell variables installanywhere

我正在使用Install Anywhere 2012,并且希望能够为给定值解析批处理或shell脚本,并将该值存储在IA变量中。例如,如果我有以下shell文件:

MY_VAR1=123
MY_VAR2=a\b\c
ECHO $MY_VAR1

我想传递文件路径和变量名称(例如MY_VAR1)并将结果123存储在我选择的IA变量中(假设为$ OUTPUT $)。我可以通过编写一些java自定义代码来实现这一点,但是想知道是否有一种内置于IA中的替代方法可以使这更容易。当我需要弄清楚它的值时,变量不会被初始化,所以基本上只是回显它的值或类似的东西是行不通的。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

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!

答案 1 :(得分:0)

在Linux / Unix上,您可以使用perl或awk(两者都是大多数发行版中的标准实用程序)。 Python或Ruby也是候选者,但可能不会安装在目标系统上。您甚至可以使用Lex和Yacc编写自己的目标解析器,并将其与安装程序一起发送。但是,根据您的需要,这肯定是矫枉过正的。

以下是执行脚本/批处理文件操作中可能的awk解决方案的示例:

#!/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。

在“执行脚本/批处理文件操作”设置中,您可以指定接收脚本操作生成的stdout和stderr流的变量。默认情况下,stdout流存储在$EXECUTE_STDOUT$中。您可以将其更改为您选择的变量名称。

在上面的示例中,$TARGET_VARIABLE_NAME$$SHELL_INPUT_FILE$是InstallAnywhere变量,分别包含要查找的变量的名称和要解析的文件的名称。在Action执行之前,这些变量将被它们的值替换。

假设我们有一个名为/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)。操作完成后,InstallAnywhere中的$EXECUTE_STDOUT$将包含Barney Rubble

您可以在此想法的基础上解析执行脚本/批处理文件操作中的任意复杂文件。只需根据需要使您的awk(或perl / Ruby / Python)脚本变得复杂。

注意:在InstallAnywhere脚本化Unix shell脚本始终时,选中“不替换未知变量”选项。如果不这样做,InstallAnywhere会将看起来像InstallAnywhere变量的任何东西悄悄地转换为空白......这非常烦人。

对于Windows解决方案,请查找独立的Windows版本的awk或perl,并将其包含在您的安装中。然后扩展上述解决方案以适用于批处理文件。

您需要创建两个执行脚本/批处理文件操作,一个用于Linux / Unix规则,另一个用于Windows规则。在调用此操作之前,您必须安装Windows awk或perl可执行文件。此外,您需要完全限定awk / perl可执行文件的路径。最后,实际脚本需要对批处理语法与shell语法的差异敏感。

下面是一个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可执行文件。

答案 2 :(得分:0)

您可以尝试从脚本

的输出中获取变量

“执行脚本” - &gt;将进程的stdout存储在:$ EXECUTE_OUTPUT $

在此之后你可以使用$ EXECUTE_OUTPUT $作为变量