0

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

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

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

4

3 回答 3

0

您可以尝试从脚本的输出中获取变量

“执行脚本”-> 将进程的标准输出存储在:$EXECUTE_OUTPUT$

然后你可以使用 $EXECUTE_OUTPUT$ 作为变量

于 2014-12-26T05:57:11.043 回答
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!
于 2013-09-18T18:22:13.207 回答
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 和 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)。操作完成后,$EXECUTE_STDOUT$在 InstallAnywhere 中将包含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 可执行文件。

于 2013-09-20T01:43:14.027 回答