簡體   English   中英

使用 Start-Process 安裝 MSI 時將參數作為變量傳遞

[英]Passing arguments as a variable when installing an MSI using Start-Process

我是 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 字符串的注釋版本中的參數列表。

任何幫助,將不勝感激!

首先,讓我歡迎您使用 Powershell! 它是一種偉大的語言,也是一個圍繞共同事業聚集的偉大社區。

由於您是該語言的新手,您仍然可以學習新技巧,這是一件好事,因為人們普遍認為 Write-Host cmdlet 幾乎總是一個糟糕的選擇。 如果你不相信我,你應該相信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

Start-Process命令不是必需的。 PowerShell 是一個外殼。 它可以運行命令。 直接把你想運行的命令放在腳本里就行了。

msiexec /i "C:\myfolder\myinstaller.msi" "AKEY=$ActivationID"

我引用了msiexec.exe的參數,以防它們中的任何一個包含空格。 PowerShell 會自動將$ActivationID變量擴展為雙引號內的字符串。

您的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM