我试图将参数传递给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
答案 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