如何正确将PowerShell数组索引作为MSI安装程序参数传递?
解决MSI安装程序参数传递时数组索引解析异常的问题
这是PowerShell双引号字符串的表达式解析规则坑到你了!当你在双引号里直接写$Servers[0]时,PowerShell的解析逻辑是先把整个$Servers数组转换成空格分隔的字符串(也就是ServerOne ServerTwo ServerThree),然后再硬拼接上[0],这就导致了日志里出现的奇怪值。
修复方案
要正确引用数组的单个元素,你需要在双引号字符串中使用子表达式语法$($Servers[0])——这个语法会让PowerShell先执行括号内的数组索引操作,再把结果插入到字符串里。
修正后的代码如下:
$Servers = @("ServerOne", "ServerTwo", "ServerThree") $InstallerArguments = @( "/i `"$InstallerPath`"", "/quiet", "/log `"$LogFile`"", "EMAILSERVER=`"$($Servers[0])`"", "DATABASESERVER=`"$($Servers[1])`"", "SHAREPOINTSERVER=`"$($Servers[2])`"", "USERNAME=`"$UserName`"" )
备选方案(可读性更优)
如果你觉得子表达式看着有点乱,也可以先把数组元素赋值给单独的变量,再在参数里引用这些变量:
$Servers = @("ServerOne", "ServerTwo", "ServerThree") $emailServer = $Servers[0] $dbServer = $Servers[1] $sharepointServer = $Servers[2] $InstallerArguments = @( "/i `"$InstallerPath`"", "/quiet", "/log `"$LogFile`"", "EMAILSERVER=`"$emailServer`"", "DATABASESERVER=`"$dbServer`"", "SHAREPOINTSERVER=`"$sharepointServer`"", "USERNAME=`"$UserName`"" )
这样修改后,MSI安装程序就能正确获取到每个服务器的单独值,不会再出现整个数组展开后拼接索引的问题了。
内容的提问来源于stack exchange,提问作者LightningWar
相关产品推荐
相关产品推荐

