diff --git a/Scripts/Save-PowerCLI.ps1 b/Scripts/Save-PowerCLI.ps1 new file mode 100644 index 0000000..8aa3230 --- /dev/null +++ b/Scripts/Save-PowerCLI.ps1 @@ -0,0 +1,57 @@ +function Save-PowerCLI { +<# +.SYNOPSIS + Function which can be used to easily download specific versions of PowerCLI from an online gallery +.DESCRIPTION + Downloads a specific version of PowerCLI and all the dependencies at the appropriate version +.NOTES + Author: 1.0 - Dimitar Milov +.PARAMETER RequiredVersion + Specify the PowerCLI version +.PARAMETER Path + Directory path where the modules should be downloaded +.PARAMETER Repository + Repository to access the PowerCLI modules +.EXAMPLE + Save-PowerCLI -RequiredVersion '10.0.0.7895300' -Path .\Downloads\ + Downloads PowerCLI 10.0.0 to the Downloads folder +#> + param( + [Parameter(Mandatory = $true)] + [version]$RequiredVersion, + + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-Path $_} )] + [string] + $Path, + + [Parameter()] + [string]$Repository = 'PSGallery' + ) + $powercliModuleName = 'VMware.PowerCLI' + $desiredPowerCLIModule = Find-Module -Name $powercliModuleName -RequiredVersion $RequiredVersion + if (-not $desiredPowerCLIModule) { + throw "'VMware.PowerCLI' with version $RequiredVersion' was not found." + } + + $depsOrder = 'VMware.VimAutomation.Sdk', 'VMware.VimAutomation.Common', 'VMware.Vim', 'VMware.VimAutomation.Cis.Core', 'VMware.VimAutomation.Core', 'VMware.VimAutomation.Nsxt', 'VMware.VimAutomation.Vmc', 'VMware.VimAutomation.Vds', 'VMware.VimAutomation.Srm', 'VMware.ImageBuilder', 'VMware.VimAutomation.Storage', 'VMware.VimAutomation.StorageUtility', 'VMware.VimAutomation.License', 'VMware.VumAutomation', 'VMware.VimAutomation.HorizonView', 'VMware.DeployAutomation', 'VMware.VimAutomation.vROps', 'VMware.VimAutomation.PCloud' + $orderedDependncies = @() + foreach ($depModuleName in $depsOrder) { + $orderedDependncies += $desiredPowerCLIModule.Dependencies | ? {$_.Name -eq $depModuleName} + } + + # Save PowerCLI Module Version + Find-Module -Name $powercliModuleName -RequiredVersion $RequiredVersion | Save-Module -Path $Path + + # Save dependencies with minimum version + foreach ($dependency in $orderedDependncies) { + Find-Module $dependency.Name -RequiredVersion $dependency.MinimumVersion | Save-Module -Path $Path + } + + # Remove newer dependencies versoin + foreach ($dependency in $orderedDependncies) { + Get-ChildItem -Path (Join-Path $path $dependency.Name) | ` + Where-Object {$_.Name -ne $dependency.MinimumVersion} | ` + Remove-Item -Confirm:$false -Force -Recurse + } +} \ No newline at end of file