将安装程序参数作为数组索引传递

时间:2018-03-20 18:07:31

标签: powershell

我试图将参数传递给MSI安装程序:

$Servers = @("ServerOne", "ServerTwo", "ServerThree")

$InstallerArguments = @(
    "/i `"$InstallerPath`"",
    "/quiet",
    "/log `"$LogFile`"",
    "EMAILSERVER=`"$Servers[0]`"",
    "DATABASESERVER=`"$Servers[1]`"",
    "SHAREPOINTSERVER=`"$Servers[2]`"",
    "USERNAME=`"$UserName`""
)

查看安装程序日志文件会显示结果:

Property(S): EMAILSERVER = ServerOne ServerTwo ServerThree[0]
Property(S): DATABASESERVER = ServerOne ServerTwo ServerThree[0]

预期结果:

Property(S): EMAILSERVER = ServerOne

我想我需要以某种方式逃避索引,代码有什么问题?

编辑(将参数传递给安装程序):

Start-Process -FilePath msiexec.exe -ArgumentList $InstallerArguments -Wait

4 个答案:

答案 0 :(得分:1)

子表达式运算符 - $() - 是一种可以在字符串中嵌入数组元素(或任意表达式的输出)的方法:

$Servers = @("ServerOne", "ServerTwo", "ServerThree")

$InstallerArguments = @(
  "/i ""$InstallerPath"""
  "/quiet"
  "/log ""$LogFile"""
  "EMAILSERVER=""$($Servers[0])"""
  "DATABASESERVER=""$($Servers[1])"""
  "SHAREPOINTSERVER=""$($Servers[2])"""
  "USERNAME=""$UserName"""
)

Start-Process msiexec.exe $InstallerArguments -Wait

子表达式运算符记录在about_Operators帮助主题中。

对于更易读的数组,您可以使用-f字符串格式化运算符和单引号;例如:

$InstallerArguments = @(
  ('/i "{0}"' -f $InstallerPath)
  '/quiet'
  ('/log "{0}"' -f $LogFile)
  ('EMAILSERVER="{0}"' -f $Servers[0])
  ('DATABASESERVER="{0}"' -f $Servers[1])
  ('SHAREPOINTSERVER="{0}"' -f $Servers[2])
  ('USERNAME="{0}"' -f $UserName)
)

答案 1 :(得分:0)

如果您使用",PowerShell会识别变量并将其替换为内容。如果它是一个数组,则元素将由$OFS连接。

如果要指定属性,元素等,必须使用$()来制作shure,PowerShell会理解这是变量的一部分(例如$($Servers[0])

如果您需要在字符串中添加",我建议您使用'(不替换变量)和-f运算符。

'EMAILSERVER="{0}"' -f $Servers[0]

此外,不需要所有这些阵列。

$InstallerPath = 'C:\'
$LogPath = 'D:\'
$MailServer = 'mail'

$InstallerArguments = '/i "{0}" /quiet /log "{1}" EMAILSERVER="{2}"' -f $InstallerPath, $LogPath, $MailServer

Start-Process -FilePath msiexec.exe -ArgumentList $InstallerArguments -Wait

我认为这更具可读性。

答案 2 :(得分:0)

这正是您想要的。我猜你确实想要报价。

$Servers = @("ServerOne", "ServerTwo", "ServerThree")

$InstallerArguments = @(
    "/i `"$InstallerPath`"",
    "/quiet",
    "/log `"$LogFile`"",
    "EMAILSERVER=`"$($Servers[0])`"",
    "DATABASESERVER=`"$($Servers[1])`"",
    "SHAREPOINTSERVER=`"$($Servers[2])`"",
    "USERNAME=`"$UserName`""
)

答案 3 :(得分:0)

阵列的复杂性太多了。 这应该有效:

$Servers = @("ServerOne", "ServerTwo", "ServerThree")
$args = '/i "{0}" /quiet /log "{1}" EMAILSERVER={2} DATABASESERVER={3} SHAREPOINTSERVER={4} USERNAME={5}' -f $InstallerPath, $LogFile, $servers[0], $servers[1], $servers[2], $username
Start-Process msiexec.exe $args