2011-01-20 22 views

Trả lời

3

Tùy thuộc. MSIs có thể được cài đặt bằng WMI. Đối với exes và các phương thức khác, bạn có thể sử dụng Start-Process và kiểm tra ProcessCode Process.

3

msi cũng có thể được cài đặt bằng msiexec.exe, MSU có thể được cài đặt bằng Wusa.exe, cả hai đều có một công tắc /quiet, /norestart/forcerestart tắc và một lựa chọn /log để đăng nhập (ghi rõ tên tập tin).

Bạn có thể đọc thêm về các tùy chọn nếu bạn gọi họ bằng /?

Lưu ý: wusa không âm thầm khi họ thất bại, vì vậy bạn phải kiểm tra các tập tin đăng nhập hoặc eventlog để xác định thành công.

0

Tôi đã triển khai chính xác những gì bạn đang tìm kiếm tại dự án hiện tại của tôi. Chúng tôi cần phải tự động triển khai và instillation của n số ứng dụng trên nhiều môi trường và trung tâm dữ liệu. Các kịch bản này được sửa đổi đôi chút so với phiên bản gốc để đơn giản vì mã hoàn chỉnh của tôi đạt tới 1000 dòng nhưng chức năng cốt lõi vẫn còn nguyên vẹn. Tôi hy vọng điều này làm những gì bạn đang yêu cầu.

Chức năng PS này kéo tất cả ứng dụng từ sổ đăng ký (thêm/xóa chương trình đọc) và sau đó tìm kiếm tên ứng dụng và phiên bản hiển thị được cung cấp. Trong mã của tôi (PSM1), tôi chạy chức năng này trước khi cài đặt cho dù đó có phải là của họ và sau đó là lời nói sau để xác minh rằng nó đã được cài đặt…. Tất cả điều này có thể được gói trong một chức năng chính để quản lý kiểm soát dòng chảy.

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} 
} 

Hàm PS này sẽ tải tệp txt có lệnh cài đặt sẵn (một dòng trên mỗi dòng). và chạy từng dòng một cách vô tình và chờ quá trình cài đặt hoàn tất trước khi chuyển sang bước tiếp theo.

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 
    } 
} 

Tệp TXT phải được định dạng như vậy ... bạn sẽ cần phải nghiên cứu cách cài đặt từng ứng dụng. một nguồn lực tốt là appdeploy.com

C:\Install.exe /q 
C:\install.msi /qn TRANSFORMS='C:\transform.mst' 
C:\install2.msi /qn /norestart 
C:\install3.exe /quiet 

Hãy cho tôi biết nếu có bất kỳ lỗi tôi đã phải sửa đổi mã hiện tại của tôi để loại bỏ các giá trị độc quyền và thực hiện điều này một chút đơn giản hơn. Tôi đang kéo các giá trị của mình từ một bảng câu trả lời XML tùy chỉnh. Nhưng mã này sẽ hoạt động như tôi đã cung cấp nó.

Nếu bạn muốn tôi thảo luận thêm về triển khai của tôi, hãy cho tôi biết và tôi có thể giải thích chi tiết hơn và cũng thêm nhiều chức năng hỗ trợ mà tôi đã triển khai.

16

Những câu trả lời này dường như quá phức tạp hoặc chưa hoàn chỉnh. Chạy trình cài đặt trong bảng điều khiển PowerShell có một số vấn đề. Một MSI được chạy trong Windows subsystem, vì vậy bạn không thể chỉ gọi chúng (Invoke-Expression hoặc &). Một số người yêu cầu để có được các lệnh đó hoạt động bằng cách đường ống đến Out-Null hoặc Out-Host, nhưng tôi đã không quan sát thấy rằng để hoạt động.

Phương pháp phù hợp với tôi là Start-Process với thông số cài đặt im lặng là 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 

Bạn có thể nhận được exit code từ lệnh Start-Process và kiểm tra giá trị vượt qua/lỗi. (và đây là số 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)" 
} 
Các vấn đề liên quan