我是Powershell的新手,当然,他试图在项目中学习 - 没有压力,对吧! : - )
我正在编写一个脚本,以安静模式运行MSI包,并将激活码作为参数传递给我,我必须从XML文件中提取。
到目前为止,除了让Start-Process运行带有在变量中传递的参数的MSI之外,我还能正常工作。
Set-ExecutionPolicy Bypass -Force
[System.Xml.XmlDocument]$XML_Doc = new-object System.Xml.XmlDocument
$XML_Doc.load('c:\myfolder\Configinfo.XML')
$ActivationID = $XML_Doc.CONFIGINFO.SITEINFO.ACTIVATEID
write-host "Activation Id is: $ActivationID"
$InstallString = "`'/I C:\myfolder\myinstaller.msi akey="+'"'+$ActivationID+'"'''
#$InstallString = "`'/I C:\myfolder\myinstaller.msi akey=`"$($ActivationID)`"'"
write-host "$InstallString"'''
Start-Process msiexec.exe -ArgumentList $InstallString -Wait -NoNewWindow
#Start-Process msiexec.exe -ArgumentList '/I C:\myfolder\myinstaller.msi akey="12345678-abcd-1a1b-x9x1-a1b2c3d4e5f6"' -Wait -NoNewWindow
以上是我正在使用的代码。注释掉的最后一行是一个有效的激活字符串。
我已经验证$ ActivationID正在撤回正确的值,并且$ InstallString镜像了Start-Process字符串的注释版本中的参数列表。
任何帮助将不胜感激!
答案 0 :(得分:0)
首先,我欢迎你加入Powershell!这是一个伟大的语言和一个围绕共同事业聚集的伟大社区。 p>
由于您是该语言的新手,您仍然可以学习新的技巧,这是一件好事,因为通常认为Write-Host cmdlet几乎总是一个糟糕的选择。如果你不相信我,你应该相信the inventor of Powershell。
现在已经不在了,我们应该看一下你的MSI命令。使用Powershell,我们不必直接打开msiexec,我们可以直接调用MSI。我会将安装程序的路径分解为自己的变量,然后我们可以在其上添加所有参数。另外,不要忘记“/ qn”开关,它实际上会使所有这些都保持沉默。总而言之,您的新脚本将如下所示:
[System.Xml.XmlDocument]$XML_Doc = new-object System.Xml.XmlDocument
$XML_Doc.load('c:\myfolder\Configinfo.XML')
$ActivationID = $XML_Doc.CONFIGINFO.SITEINFO.ACTIVATEID
Write-Verbose "Activation Id is: $ActivationID"
$msipath = "C:\myfolder\myinstaller.msi"
$args = @("akey=$ActivationID", "/qn")
Write-Verbose "Install path is $msipath"
Write-Verbose "Activation key is $akey"
Start-Process $msipath -ArgumentList $args -Wait -NoNewWindow
答案 1 :(得分:0)
Start-Process
命令不是必需的。 PowerShell是一个shell。它可以运行命令。只需将要运行的命令直接放在脚本中即可。
msiexec /i "C:\myfolder\myinstaller.msi" "AKEY=$ActivationID"
我将参数引用到msiexec.exe
,以防它们中的任何一个包含空格。 PowerShell会自动将$ActivationID
变量扩展为双引号内的字符串。
答案 2 :(得分:0)
您的ArgumentList
传递错误。
[Xml]$XML_Doc = Get-Content -Path 'C:\myfolder\Configinfo.xml'
$ActivationID = $XML_Doc.CONFIGINFO.SITEINFO.ACTIVATEID
Write-Host "Activation Id is: $ActivationID"
$Path = 'msiexec'
$ArgList = @('/i','"C:\path\file.msi"',"akey=`"$ActivationID`"")
Write-Host "$Path $ArgList"
Start-Process -FilePath $Path -ArgumentList $ArgList -Wait -NoNewWindow