在 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 可执行文件。