我正在使用Install Anywhere 2012,并且希望能够为给定值解析批处理或shell脚本,并将该值存储在IA变量中。例如,如果我有以下shell文件:
MY_VAR1=123
MY_VAR2=a\b\c
ECHO $MY_VAR1
我想传递文件路径和变量名称(例如MY_VAR1)并将结果123存储在我选择的IA变量中(假设为$ OUTPUT $)。我可以通过编写一些java自定义代码来实现这一点,但是想知道是否有一种内置于IA中的替代方法可以使这更容易。当我需要弄清楚它的值时,变量不会被初始化,所以基本上只是回显它的值或类似的东西是行不通的。任何帮助将不胜感激!
答案 0 :(得分:0)
示例:
@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 $作为变量