मैं अनुप्रयोगों का एक सेट स्थापित करना चाहता हूं: .NET 4, स्नैप-इन्स, ASP.NET MVC 3, आदि। मैं एप्लिकेशन को इंस्टॉल करने और उस मान को वापस कैसे प्राप्त करूं जो यह निर्धारित करता है कि इंस्टॉलेशन सफल था या नहीं?मैं विंडोज़ इंस्टॉलर कैसे चला सकता हूं और PowerShell में सफल/असफल मान प्राप्त करूं?
उत्तर
निर्भर करता है। एमएसआई को डब्लूएमआई का उपयोग करके स्थापित किया जा सकता है। पूर्व और अन्य तरीकों के लिए, आप स्टार्ट-प्रोसेस का उपयोग कर सकते हैं और प्रक्रिया ExitCode की जांच कर सकते हैं।
MSI के भी msiexec.exe, MSU के Wusa.exe का उपयोग कर स्थापित किया जा सकता का उपयोग कर स्थापित किया जा सकता है, दोनों एक /quiet
स्विच, /norestart
और /forcerestart
स्विच और प्रवेश करने की एक /log
विकल्प (फ़ाइल नाम निर्दिष्ट) है।
आप विकल्पों के बारे में और अधिक पढ़ सकते हैं यदि आप उन लोगों के साथ /?
नोट फोन: wusa चुपचाप विफल रहता है जब वे असफल हो, तो आप लॉग फ़ाइल या eventlog जाँच करने के लिए सफलता का निर्धारण करने के लिए है।
मैंने अपने वर्तमान प्रोजेक्ट में जो भी खोजा है, उसे लागू किया है। हमें कई वातावरण और डेटासेंटर में कई संख्या में ऐप्स की तैनाती और प्रबलता स्वचालित करने की आवश्यकता है। सादगी के लिए इन स्क्रिप्ट को मूल संस्करण से थोड़ा संशोधित किया गया है क्योंकि मेरा पूरा कोड 1000 लाइनों तक पहुंच रहा है लेकिन मूल कार्यक्षमता बरकरार है। मुझे आशा है कि यह वही करता है जो आप पूछ रहे हैं।
यह पीएस फ़ंक्शन रजिस्ट्री से सभी ऐप्स खींचता है (प्रोग्राम क्या जोड़ता/हटाता है) और फिर आपूर्ति किए गए ऐप नाम और प्रदर्शन संस्करण के लिए खोज करता है। मेरे कोड (पीएसएम 1) में मैं इस फ़ंक्शन को चलाने से पहले यह इंस्टॉल करता हूं कि यह इंस्टॉल है या नहीं, फिर बाद में यह सत्यापित करने के लिए कि यह इंस्टॉल हो गया है ...। यह सब एक मास्टर फ़ंक्शन में प्रबंधक प्रवाह नियंत्रण में लपेटा जा सकता है।
function Confirm-AppInstall{
param($AppName,$AppVersion)
$Apps = Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*|?{$_.DisplayName -ne $Null}|?{$_.DisplayName -ne ""}
$Apps += Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*|?{$_.DisplayName -ne $Null}|?{$_.DisplayName -ne ""}
$Installed = $Apps|?{$_.DisplayName -eq ""}|?{$_.DisplayVersion -eq ""}|select -First 1
if($Installed -ne $null){return $true}else{return $false}
}
यह पीएस फ़ंक्शन एक txt फ़ाइल लोड करेगा जिसमें इंस्टॉल कमांड प्रीपेप्लेटेड (प्रति पंक्ति एक कमांड) होगा। और प्रत्येक पंक्ति को indivaduly चलाएं और अगले पर जाने से पहले इंस्टॉलेशन के लिए प्रतीक्षा करें।
function Install-Application{
param($InstallList = "C:\Install_Apps_CMDS.txt")
$list = gc -Path $InstallList
foreach ($Command in $list){
Write-Output ("[{0}]{1}" -f (Get-Date -Format G),$call)
#Make install process wait for exit before continuing.
$p = [diagnostics.process]::Start("powershell.exe","-NoProfile -NoLogo -Command $Command")
$p.WaitForExit()
Start-Sleep -Seconds 2
#Searches for the installer exe or msi that was directly opened by powershell and gets the process id.
$ProcessID = (gwmi -Query ("select ProcessId from Win32_Process WHERE ParentProcessID = {0} AND Name = '{1}'" -f $p.Id,$ParentProcessFile)|select ProcessId).ProcessId
#waits for the exe or msi to finish installing
while ((Get-Process -Id $ProcessID -ea 0) -ne $null){
Start-Sleep -Seconds 2
$ElapsedTime = [int](New-TimeSpan -Start $P.StartTime -End (Get-Date)|select TotalSeconds).TotalSeconds
#install times out after 1000 seconds so it dosent just sit their forever this can be changed
if(2000 -lt $ElapsedTime){
Write-Output ('[{0}] The application "{1}" timed out during instilation and was forcfully exited after {2} seconds.' -f (Get-Date -Format G),$App.Name,(([int]$App.InstallTimeOut) * 60))
break
}
}
#clean up any old or hung install proccess that should not be running at this point.
Stop-Process -Name $ParentProcessName -ea 0 -Force
Stop-Process -Name msiexec -ea 0 -Force
}
}
TXT फ़ाइल जैसे स्वरूपित किया जाना चाहिए ... आप कैसे करने के लिए प्रत्येक अनुप्रयोग स्थापित किए जाने की आवश्यकता पर आप शोध करने की आवश्यकता होगी। एक अच्छा संसाधन appdeploy.com
C:\Install.exe /q
C:\install.msi /qn TRANSFORMS='C:\transform.mst'
C:\install2.msi /qn /norestart
C:\install3.exe /quiet
मुझे पता है अगर वहाँ किसी भी त्रुटि मैं मालिकाना मूल्यों को हटा दें और इस एक छोटे से भी अधिक साधारण बनाने के लिए अपने मौजूदा कोड को संशोधित करने के लिए किया था कर रहे हैं चलो है। मैं अपने मूल्यों को एक कस्टम एक्सएमएल उत्तर पत्र से खींच रहा हूं। लेकिन इस कोड को काम करना चाहिए क्योंकि मैंने इसे आपूर्ति की है।
यदि आप मेरे कार्यान्वयन के बारे में और अधिक चर्चा करना चाहते हैं तो मुझे बताएं और मैं एक और विस्तृत स्पष्टीकरण दे सकता हूं और मैंने जो भी कार्यान्वित कार्यान्वित किया है, उसे भी जोड़ सकते हैं।
ये उत्तर सभी अत्यधिक जटिल या पर्याप्त पूर्ण नहीं लगते हैं। PowerShell कंसोल में इंस्टॉलर चलाना कुछ समस्याएं हैं। एक एमएसआई Windows subsystem में चलाया जाता है, इसलिए आप उन्हें केवल (Invoke-Expression
या &
) नहीं बुला सकते हैं। कुछ लोग उन आदेशों को Out-Null
या Out-Host
पर पाइप करके काम करने का दावा करते हैं, लेकिन मैंने यह काम नहीं देखा है।
मेरे लिए काम करने वाली विधि Start-Process
msiexec
पर चुप स्थापना पैरामीटर के साथ है।
$list =
@(
"/I `"$msi`"", # Install this MSI
"/QN", # Quietly, without a UI
"/L*V `"$ENV:TEMP\$name.log`"" # Verbose output to this log
)
Start-Process -FilePath "msiexec" -ArgumentList $list -Wait
आप Start-Process
आदेश से exit code हो और पारित करने के लिए यह निरीक्षण कर सकते हैं/असफल मान। (और यहां exit code reference है)
$p = Start-Process -FilePath "msiexec" -ArgumentList $list -Wait -PassThru
if($p.ExitCode -ne 0)
{
throw "Installation process returned error code: $($p.ExitCode)"
}