Install-Dynamics365Language.psm1
function Install-Dynamics365Language { param ( [parameter(Position=0, Mandatory=$true)] [string] $MediaDir ) $msiFile = Get-ChildItem "$mediaDir\MuiSetup_????_amd64.msi"; if ( $msiFile.Count -eq 1 ) { $msiFullName = $msiFile.FullName; $languageCode = $msiFile.Name.Substring( 9, 4 ); $installedProducts = Get-WmiObject Win32_Product | % { $_.IdentifyingNumber } if ( $installedProducts -contains "{$( $Dynamics365Resources.Dynamics365Server90.IdentifyingNumber )}" ) { Write-Host "$(Get-Date) Detected Dynamics 9.X installed"; $fileResourceNamePrefix = "Dynamics365Server90LanguagePack"; } if ( $installedProducts -contains "{$( $Dynamics365Resources.CRM2016.IdentifyingNumber )}" ) { Write-Host "$(Get-Date) Detected Dynamics 8.X installed"; $fileResourceNamePrefix = "CRM2016LanguagePack"; } $foundFileResource = $null; $Dynamics365Resources | Get-Member -MemberType NoteProperty | ? { $_.Name.StartsWith( $fileResourceNamePrefix ) } | % { if ( $Dynamics365Resources.( $_.Name ).LanguageCode -eq $languageCode ) { $foundFileResource = $_.Name } } if ( $foundFileResource ) { Write-Host "Found corresponding resource in the catalog: $foundFileResource"; $expectedProductIdentifyingNumber = $Dynamics365Resources.$foundFileResource.IdentifyingNumber; } else { Write-Host "Corresponding resource is not found in the catalog. Installation verification will be skipped"; } if ( $expectedProductIdentifyingNumber ) { $isInstalled = $installedProducts -contains "{$expectedProductIdentifyingNumber}"; } else { Write-Host "IdentifyingNumber is not specified for this product, installation verification will be skipped"; } if ( !$expectedProductIdentifyingNumber -or !$isInstalled ) { Write-Host "$(Get-Date) Starting $msiFullName"; $logFile = '{0}-{1}.log' -f $msiFile.Name, $DataStamp; $MSIArguments = @( "/i" ( '"{0}"' -f $msiFullName ) "/qn" "/norestart" "/L*v" $logFile ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow; Write-Host "$(Get-Date) Finished $msiFullName"; $isInstalled = $false; $retries = 20; While ( !$isInstalled -and $retries -gt 0 ) { Write-Host "$(Get-Date) Verifying product installation, retries left: $retries" Write-Host "The following products were installed:" Get-WmiObject Win32_Product | % { if ( $expectedProductIdentifyingNumber -or ( $_.IdentifyingNumber -eq "{$expectedProductIdentifyingNumber}" ) ) { $isInstalled = $true; } if ( !( $installedProducts -contains $_.IdentifyingNumber ) ) { Write-Host $_.IdentifyingNumber, $_.Name; } } $retries--; Sleep 10; } if ( $expectedProductIdentifyingNumber ) { if ( $isInstalled ) { Write-Host "Installation is finished and verified successfully"; } else { Write-Host "Installation job finished but the product is still not installed"; Throw "Installation job finished but the product is still not installed"; } } else { Write-Host "Installation is finished but verification cannot be done without IdentifyingNumber specified."; } } else { Write-Host "Product is already installed, skipping" } } else { Write-Host "$(Get-Date) No or too many $mediaDir\MuiSetup_????_amd64.msi files were found"; } } |