Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Releasing v0.19.0 #381

Merged
merged 22 commits into from
Feb 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
29fb905
Removes extraneous output when unmounting ISOs (Windows 10 1903 only?)
iainbrighton Jun 14, 2019
ef47ea9
Merge pull request #366 from iainbrighton/master
iainbrighton Jun 14, 2019
609d09b
Adds Export-LabImage
iainbrighton Jun 25, 2019
5e6b6ce
Adds CustomId to Register-LabMedia
iainbrighton Jun 25, 2019
798e6fc
Merge pull request #369 from iainbrighton/dev
iainbrighton Jun 25, 2019
9f86848
Adds 'Latest' property to module info
iainbrighton Jun 26, 2019
53fd19d
Merge remote-tracking branch 'upstream/dev' into dev
iainbrighton Jun 26, 2019
cc27b28
Merge pull request #370 from iainbrighton/dev
iainbrighton Jun 26, 2019
e7425d7
Adds environment name support for differencing VHDs
iainbrighton Jul 3, 2019
3083697
Merge pull request #371 from iainbrighton/Issue78
iainbrighton Jul 3, 2019
163f96a
Updates broken 'The Ultimate Hyper-V Lab Tool' link
iainbrighton Jul 3, 2019
0a3819c
Merge pull request #372 from iainbrighton/dev
iainbrighton Jul 3, 2019
143f53e
Updates code signing certificate
iainbrighton Jul 19, 2019
072afa0
Merge pull request #373 from iainbrighton/dev
iainbrighton Jul 19, 2019
5e82382
Adds version checking of downloaded modules
iainbrighton Sep 17, 2019
78ad0da
Merge pull request #377 from iainbrighton/Issue375
iainbrighton Sep 17, 2019
052565b
Updates default Win 10 evaluation media to build 1909
iainbrighton Feb 3, 2020
7149701
Fixes json document formatting trailing line error
iainbrighton Feb 3, 2020
76aeb78
Merge pull request #379 from iainbrighton/dev
iainbrighton Feb 3, 2020
a360071
Releasing v0.19.0
iainbrighton Feb 3, 2020
48563d4
Merge remote-tracking branch 'upstream/dev' into dev
iainbrighton Feb 3, 2020
ced90b2
Merge pull request #380 from iainbrighton/dev
iainbrighton Feb 3, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Build.PSake.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ Properties {
$buildDir = 'Release';
$buildPath = (Join-Path -Path $basePath -ChildPath $buildDir);
$releasePath = (Join-Path -Path $buildPath -ChildPath $moduleName);
$thumbprint = '3DACD0F2D1E60EB33EC774B9CFC89A4BEE9037AF';
$timeStampServer = 'http://timestamp.verisign.com/scripts/timestamp.dll';
$thumbprint = '177FC8E667D4C022C7CD9CFDFEB66991890F4090';
$timeStampServer = 'http://timestamp.digicert.com';
$exclude = @(
'.git*',
'.vscode',
Expand Down Expand Up @@ -79,9 +79,9 @@ Task Sign -Depends Deploy {

if (-not (Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object Thumbprint -eq $thumbprint)) {
## Decrypt and import code signing cert
.\appveyor-tools\secure-file.exe -decrypt .\VE_Certificate_2019.pfx.enc -secret $env:certificate_secret
.\appveyor-tools\secure-file.exe -decrypt .\VE_Certificate_2021.pfx.enc -secret $env:certificate_secret
$certificatePassword = ConvertTo-SecureString -String $env:certificate_secret -AsPlainText -Force
Import-PfxCertificate -FilePath .\VE_Certificate_2019.pfx -CertStoreLocation 'Cert:\CurrentUser\My' -Password $certificatePassword
Import-PfxCertificate -FilePath .\VE_Certificate_2021.pfx -CertStoreLocation 'Cert:\CurrentUser\My' -Password $certificatePassword
}

Get-ChildItem -Path $releasePath -Exclude $signExclude | ForEach-Object {
Expand Down
13 changes: 13 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@

## Versions ##

### v0.19.0 ###

* Removes extraneous output when unmounting ISOs (Windows 10 1903 only?)
* Adds `Export-LabImage` cmdlet to export VHD(X) master/parent images
* Permits overriding media Id with -CustomId` parameter when importing legacy media definitions or media from an external file/Uri with `Register-LabMedia`
* Adds `Latest` property to module info to force latest module version download - on every configuration run (#367)
* Adds `-DisableVhdEnvironmentName` parameter to `Set-LabHostDefault` (#78)
* New installations/deployments will default to False - creating VM differencing disks in a subdirectory when EnvironmentName is defined in configuration data
* Existing installations will default to True (at least until `Set-LabHostDefault` or `Reset-LabHostDefault` are called)
* Adds version checking of downloaded modules (#375)
* Updates default Windows 10 evaluation media to 19H2 build (1909)
* Updates default VM media from `2012R2_x64_Standard_EN_Eval` to `2019_x64_Standard_EN_Eval`

### v0.18.0 ###

* Updates bundled xHyper-V DSC resource to v3.16.0
Expand Down
4 changes: 3 additions & 1 deletion Config/HostDefaults.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@
"ResourcePath": "%SYSTEMDRIVE%\\Lability\\Resources",
"ResourceShareName": "Resources",
"DisableLocalFileCaching": false,
"DisableSwitchEnvironmentName": false
"DisableSwitchEnvironmentName": false,
"DisableVhdEnvironmentName": false

}
25 changes: 25 additions & 0 deletions Config/LegacyMedia/WIN10_x64_Enterprise_1903_EN_Eval.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"Id": "WIN10_x64_Enterprise_1903_EN_Eval",
"Filename": "WIN10_x64_ENT_19H1_EN_Eval.iso",
"Description": "Windows 10 64bit Enterprise 1903 English Evaluation",
"Architecture": "x64",
"ImageName": "Windows 10 Enterprise Evaluation",
"MediaType": "ISO",
"OperatingSystem": "Windows",
"Uri": "https://software-download.microsoft.com/download/pr/18362.30.190401-1528.19h1_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso",
"Checksum": "70C7E8F0599BBB4526F08E6814925E50",
"CustomData": {
"WindowsOptionalFeature": [
"NetFx3"
],
"CustomBootstrap": [
"## Unattend.xml will set the Administrator password, but it won't enable the account on client OSes",
"NET USER Administrator /active:yes;",
"Set-ItemProperty -Path HKLM:\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell -Name ExecutionPolicy -Value RemoteSigned -Force; #306",
"## Kick-start PowerShell remoting on clients to permit applying DSC configurations",
"Enable-PSRemoting -SkipNetworkProfileCheck -Force;"
],
"MinimumDismVersion": "10.0.0.0"
},
"Hotfixes": []
}
25 changes: 25 additions & 0 deletions Config/LegacyMedia/WIN10_x86_Enterprise_1903_EN_Eval.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"Id": "WIN10_x86_Enterprise_1903_EN_Eval",
"Filename": "WIN10_x86_ENT_19H1_EN_Eval.iso",
"Description": "Windows 10 32bit Enterprise 1903 English Evaluation",
"Architecture": "x86",
"ImageName": "Windows 10 Enterprise Evaluation",
"MediaType": "ISO",
"OperatingSystem": "Windows",
"Uri": "https://software-download.microsoft.com/download/pr/18362.30.190401-1528.19h1_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x86FRE_en-us.iso",
"Checksum": "1945092B75613D7822B82D3AFB378F1D",
"CustomData": {
"WindowsOptionalFeature": [
"NetFx3"
],
"CustomBootstrap": [
"## Unattend.xml will set the Administrator password, but it won't enable the account on client OSes",
"NET USER Administrator /active:yes;",
"Set-ItemProperty -Path HKLM:\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell -Name ExecutionPolicy -Value RemoteSigned -Force; #306",
"## Kick-start PowerShell remoting on clients to permit applying DSC configurations",
"Enable-PSRemoting -SkipNetworkProfileCheck -Force;"
],
"MinimumDismVersion": "10.0.0.0"
},
"Hotfixes": []
}
16 changes: 8 additions & 8 deletions Config/Media.json
Original file line number Diff line number Diff line change
Expand Up @@ -713,14 +713,14 @@
},
{
"Id": "WIN10_x64_Enterprise_EN_Eval",
"Filename": "WIN10_x64_ENT_19H1_EN_Eval.iso",
"Description": "Windows 10 64bit Enterprise 1903 English Evaluation",
"Filename": "WIN10_x64_ENT_19H2_EN_Eval.iso",
"Description": "Windows 10 64bit Enterprise 1909 English Evaluation",
"Architecture": "x64",
"ImageName": "Windows 10 Enterprise Evaluation",
"MediaType": "ISO",
"OperatingSystem": "Windows",
"Uri": "https://software-download.microsoft.com/download/pr/18362.30.190401-1528.19h1_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso",
"Checksum": "70C7E8F0599BBB4526F08E6814925E50",
"Uri": "https://software-download.microsoft.com/download/pr/18363.418.191007-0143.19h2_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso",
"Checksum": "B3CD4BAE54E74F1CA497216A3F347CA7",
"CustomData": {
"WindowsOptionalFeature": ["NetFx3"],
"CustomBootstrap": [
Expand All @@ -736,14 +736,14 @@
},
{
"Id": "WIN10_x86_Enterprise_EN_Eval",
"Filename": "WIN10_x86_ENT_19H1_EN_Eval.iso",
"Description": "Windows 10 32bit Enterprise 1903 English Evaluation",
"Filename": "WIN10_x86_ENT_19H2_EN_Eval.iso",
"Description": "Windows 10 32bit Enterprise 1909 English Evaluation",
"Architecture": "x86",
"ImageName": "Windows 10 Enterprise Evaluation",
"MediaType": "ISO",
"OperatingSystem": "Windows",
"Uri": "https://software-download.microsoft.com/download/pr/18362.30.190401-1528.19h1_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x86FRE_en-us.iso",
"Checksum": "1945092B75613D7822B82D3AFB378F1D",
"Uri": "https://software-download.microsoft.com/download/pr/18363.418.191007-0143.19h2_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x86FRE_en-us.iso",
"Checksum": "B700FF7684BE392F266B22289CA75979",
"CustomData": {
"WindowsOptionalFeature": ["NetFx3"],
"CustomBootstrap": [
Expand Down
2 changes: 1 addition & 1 deletion Config/VMDefaults.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"MaximumMemory": 1099511627776,
"ProcessorCount": 1,
"SwitchName": "Default Switch",
"Media": "2012R2_x64_Standard_EN_Eval",
"Media": "2019_x64_Standard_EN_Eval",
"TimeZone": "UTC",
"UILanguage": "en-US",
"SystemLocale": "en-US",
Expand Down
2 changes: 2 additions & 0 deletions Examples/ModuleExample.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
@{ Name = 'PScribo' }
## Downloads the development branch of the Lability module directly from Github
@{ Name = 'Lability'; Provider = 'GitHub'; Owner = 'VirtualEngine'; Branch = 'dev'; }
## Force a download the latest published module version from the PSGallery - every configuration run
@{ Name = 'PSReadLine'; Latest = $true }
)
};
};
Expand Down
3 changes: 2 additions & 1 deletion Lability.psd1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
@{
RootModule = 'Lability.psm1';
ModuleVersion = '0.18.0';
ModuleVersion = '0.19.0';
GUID = '374126b4-f3d4-471d-b25e-767f69ee03d0';
Author = 'Iain Brighton';
CompanyName = 'Virtual Engine';
Expand All @@ -13,6 +13,7 @@
'Clear-LabModuleCache',
'Clear-ModulePath',
'Export-LabHostConfiguration',
'Export-LabImage',
'Get-LabHostConfiguration',
'Get-LabHostDefault',
'Get-LabImage',
Expand Down
36 changes: 19 additions & 17 deletions Lability.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

## Set the global defaults
$labDefaults = @{
ModuleRoot = Split-Path -Path $MyInvocation.MyCommand.Path -Parent;
ModuleName = 'Lability';
ConfigurationData = 'Config';
HostConfigFilename = 'HostDefaults.json';
VmConfigFilename = 'VmDefaults.json';
MediaConfigFilename = 'Media.json';
ModuleRoot = Split-Path -Path $MyInvocation.MyCommand.Path -Parent;
ModuleName = 'Lability';
ConfigurationData = 'Config';
HostConfigFilename = 'HostDefaults.json';
VmConfigFilename = 'VmDefaults.json';
MediaConfigFilename = 'Media.json';
CustomMediaConfigFilename = 'CustomMedia.json';
LegacyMediaPath = 'LegacyMedia';
DscResourceDirectory = 'DSCResources';
RepositoryUri = 'https://www.powershellgallery.com/api/v2/package';
DismVersion = $null;
LegacyMediaPath = 'LegacyMedia';
DscResourceDirectory = 'DSCResources';
RepositoryUri = 'https://www.powershellgallery.com/api/v2/package';
DismVersion = $null;
}

#region LocalizedData
Expand All @@ -22,9 +22,9 @@ if (Test-Path -Path (Join-Path -Path $labDefaults.ModuleRoot -ChildPath $PSUICul
}
$importLocalizedDataParams = @{
BindingVariable = 'localized';
Filename = "Lability.Resources.psd1";
BaseDirectory = $moduleRoot;
UICulture = $culture;
Filename = 'Lability.Resources.psd1';
BaseDirectory = $moduleRoot;
UICulture = $culture;
}
Import-LocalizedData @importLocalizedDataParams;
#endregion LocalizedData
Expand All @@ -35,7 +35,7 @@ $moduleSrcPath = Join-Path -Path $moduleRoot -ChildPath 'Src';
Get-ChildItem -Path $moduleSrcPath -Include *.ps1 -Exclude '*.Tests.ps1' -Recurse |
ForEach-Object {
Write-Verbose -Message ('Importing library\source file ''{0}''.' -f $_.FullName);
## https://becomelotr.wordpress.com/2017/02/13/expensive-dot-sourcing/
# https://becomelotr.wordpress.com/2017/02/13/expensive-dot-sourcing/
. ([System.Management.Automation.ScriptBlock]::Create(
[System.IO.File]::ReadAllText($_.FullName)
));
Expand All @@ -45,9 +45,11 @@ Get-ChildItem -Path $moduleSrcPath -Include *.ps1 -Exclude '*.Tests.ps1' -Recurs
$moduleConfigPath = Join-Path -Path $moduleRoot -ChildPath 'Config';
$allUsersConfigPath = Join-Path -Path $env:AllUsersProfile -ChildPath "$($labDefaults.ModuleName)\Certificates\";
[ref] $null = New-Directory -Path $allUsersConfigPath;
Get-ChildItem -Path $moduleConfigPath -Include *.cer,*.pfx -Recurse | ForEach-Object {
Write-Verbose -Message ('Updating certificate ''{0}''.' -f $_.FullName);
Copy-Item -Path $_ -Destination $allUsersConfigPath;
Get-ChildItem -Path $moduleConfigPath -Include *.cer, *.pfx -Recurse | ForEach-Object {
if (-not (Test-Path -Path (Join-Path -Path $allUsersConfigPath -ChildPath $_.Name))) {
Write-Verbose -Message ('Updating certificate ''{0}''.' -f $_.FullName);
Copy-Item -Path $_ -Destination $allUsersConfigPath;
}
}

## Create the credential check scriptblock
Expand Down
4 changes: 2 additions & 2 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,10 @@ __[here](https://www.youtube.com/watch?v=jefhLaJsG3E "Man vs TestLab")__. Other

* [Lability tutorial](https://me.micahrl.com/lability-tutorial) by [mrled](https://github.com/mrled)
* [Building A Lab using Hyper-V and Lability](https://blog.kilasuit.org/2016/04/13/building-a-lab-using-hyper-v-and-lability-the-end-to-end-example/) via @kilasuit
* [The Ultimate Hyper-V Lab Tool](http://www.absolutejam.co.uk/blog/lability-ultimate-hyperv-lab-tool/) via @absolutejam
* [The Ultimate Hyper-V Lab Tool](https://web.archive.org/web/20180830192145/http://www.absolutejam.co.uk/blog/lability-ultimate-hyperv-lab-tool/) via @absolutejam
* [Create Your Virtual Lab Environment with Lability How-To](http://blog.mscloud.guru/2016/09/17/create-your-virtual-lab-environment-with-lability-howto/) via @Naboo2604
* [Microsoft Channel 9 PSDEVOPS](https://channel9.msdn.com/Blogs/PSDEVOPSSIG/PSDEVOPSSIGEventLability-Demo-w-Iain-Brigton) presentation recording
* [Using Lability, DSC and ARM to define and deploy multi-VM environments] (https://blogs.blackmarble.co.uk/rhepworth/2017/03/02/define-once-deploy-everywhere-sort-of/) via @rikhepworth
* [Using Lability, DSC and ARM to define and deploy multi-VM environments](https://blogs.blackmarble.co.uk/rhepworth/2017/03/02/define-once-deploy-everywhere-sort-of/) via @rikhepworth
* [Building Hyper-V lab environments based on PowerShell DSC](http://www.powershell.no/hyper-v,/powershell/dsc/2017/07/19/lability.html) via @JanEgilRing

[__Lability__ image/logo attribution credit](https://openclipart.org/image/300px/svg_to_png/22734/papapishu-Lab-icon-1.png)
4 changes: 2 additions & 2 deletions Src/Private/Copy-LabModule.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ function Copy-LabModule {
}
else {

$powerShellModules = $ConfigurationData.NonNodeData.Lability.Module;
$powerShellModules = $ConfigurationData.NonNodeData.$($labDefaults.ModuleName).Module;
}

if ($null -ne $powerShellModules) {
Expand Down Expand Up @@ -73,7 +73,7 @@ function Copy-LabModule {
}
else {

$dscResourceModules = $ConfigurationData.NonNodeData.Lability.DSCResource;
$dscResourceModules = $ConfigurationData.NonNodeData.$($labDefaults.ModuleName).DSCResource;
}

if ($null -ne $dscResourceModules) {
Expand Down
2 changes: 1 addition & 1 deletion Src/Private/Expand-LabImage.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ function Expand-LabImage {

## Always dismount ISO (#166)
Write-Verbose -Message ($localized.DismountingDiskImage -f $MediaPath);
Storage\Dismount-DiskImage -ImagePath $MediaPath;
$null = Storage\Dismount-DiskImage -ImagePath $MediaPath;
}

## Enable BitLocker (if required)
Expand Down
2 changes: 1 addition & 1 deletion Src/Private/Expand-LabIso.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ function Expand-LabIso {
Write-Verbose -Message ($localized.ExpandingIsoResource -f $DestinationPath);
CopyDirectory -SourcePath $sourcePath -DestinationPath $DestinationPath -Force -Verbose:$false;
Write-Verbose -Message ($localized.DismountingDiskImage -f $Path);
Storage\Dismount-DiskImage -ImagePath $Path;
$null = Storage\Dismount-DiskImage -ImagePath $Path;

## Enable BitLocker (if required)
Assert-BitLockerFDV;
Expand Down
7 changes: 7 additions & 0 deletions Src/Private/Get-ConfigurationData.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,13 @@ function Get-ConfigurationData {
[ref] $null = Add-Member -InputObject $configurationData -MemberType NoteProperty -Name 'DisableSwitchEnvironmentName' -Value $true;
}

## This property may not be present in the original machine configuration file. Defaults to $true for existing
## deployments, but is disabled ($false) in the default HostDefaults.json for new installs.
if ($configurationData.PSObject.Properties.Name -notcontains 'DisableVhdEnvironmentName') {

[ref] $null = Add-Member -InputObject $configurationData -MemberType NoteProperty -Name 'DisableVhdEnvironmentName' -Value $true;
}

## Remove deprecated UpdatePath, if present (Issue #77)
$configurationData.PSObject.Properties.Remove('UpdatePath');
}
Expand Down
7 changes: 6 additions & 1 deletion Src/Private/Get-LabVirtualMachineProperty.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,12 @@ function Get-LabVirtualMachineProperty {
}
}

$vhdPath = Resolve-LabVMDiskPath -Name $Name -Generation $labImage.Generation;
$resolveLabVMDiskPathParams = @{
Name = $Name;
Generation = $labImage.Generation;
EnvironmentName = $ConfigurationData.NonNodeData.$($labDefaults.ModuleName).EnvironmentName;
}
$vhdPath = Resolve-LabVMDiskPath @resolveLabVMDiskPathParams;

[ref] $null = $PSBoundParameters.Remove('Media');
[ref] $null = $PSBoundParameters.Remove('ConfigurationData');
Expand Down
25 changes: 11 additions & 14 deletions Src/Private/Invoke-LabModuleCacheDownload.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -110,25 +110,22 @@ function Invoke-LabModuleCacheDownload {

foreach ($moduleInfo in $Module) {

if ((-not (Test-LabModuleCache @moduleInfo)) -or ($Force)) {
if ((-not (Test-LabModuleCache @moduleInfo)) -or ($Force) -or ($moduleInfo.Latest -eq $true)) {

if ((-not $moduleInfo.ContainsKey('Provider')) -or ($moduleInfo['Provider'] -eq 'PSGallery')) {

if ($moduleInfo.ContainsKey('RequiredVersion')) {
Write-Verbose -Message ($localized.ModuleVersionNotCached -f $moduleInfo.Name, $moduleInfo.RequiredVersion);
}
elseif ($moduleInfo.ContainsKey('MinimumVersion')) {
Write-Verbose -Message ($localized.ModuleMinmumVersionNotCached -f $moduleInfo.Name, $moduleInfo.MinimumVersion);
}
else {
Write-Verbose -Message ($localized.ModuleNotCached -f $moduleInfo.Name);
}
if ($moduleInfo.ContainsKey('RequiredVersion')) {
Write-Verbose -Message ($localized.ModuleVersionNotCached -f $moduleInfo.Name, $moduleInfo.RequiredVersion);
}
elseif ($moduleInfo.ContainsKey('MinimumVersion')) {
Write-Verbose -Message ($localized.ModuleMinmumVersionNotCached -f $moduleInfo.Name, $moduleInfo.MinimumVersion);
}
else {
Write-Verbose -Message ($localized.ModuleNotCached -f $moduleInfo.Name);
}

if ((-not $moduleInfo.ContainsKey('Provider')) -or ($moduleInfo['Provider'] -eq 'PSGallery')) {
Invoke-LabModuleDownloadFromPSGallery @moduleInfo;
}
elseif ($moduleInfo['Provider'] -eq 'GitHub') {

Write-Verbose -Message ($localized.ModuleNotCached -f $moduleInfo.Name);
Invoke-LabModuleDownloadFromGitHub @moduleInfo;
}
elseif ($moduleInfo['Provider'] -eq 'FileSystem') {
Expand Down
Loading