[英]Passing variable arguments using PowerShell's Start-Process cmdlet
[英]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.