使用Start-Process

时间:2017-11-01 19:26:54

标签: powershell

我是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字符串的注释版本中的参数列表。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

首先,我欢迎你加入Powershell!这是一个伟大的语言和一个围绕共同事业聚集的伟大社区。

由于您是该语言的新手,您仍然可以学习新的技巧,这是一件好事,因为通常认为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