diff --git a/Scripts/PowerCLI_FixNestedFolders.ps1 b/Scripts/PowerCLI_FixNestedFolders.ps1 new file mode 100644 index 0000000..a4e8afe --- /dev/null +++ b/Scripts/PowerCLI_FixNestedFolders.ps1 @@ -0,0 +1,96 @@ +<# +Script name: PowerCLI_FixNestedFolders.ps1 +Created on: 01/11/2018 +Author: Kyle Ruddy, @kmruddy, thatcouldbeaproblem.com +Description: The purpose of the script is to remove the nested Version based folders when using Powercli on systems using older versions of PowerShell +Dependencies: None known + +===Tested Against Environment==== +PowerCLI Version: PowerCLI 6.5.4 +PowerShell Version: 5.1, 4.0 +OS Version: Server 2016, Server 2012 R2 +#> + +# Variable used to store where the PowerCLI module folders exist +$pcliFolder = @() + +# Variable used to store the current PSModulePath locations +$downloadDir = $env:PSModulePath.Split(';') + +# Loop to detect PowerCLI module folders in any of the PSModulePath locations +foreach ($possPath in $downloadDir) { + + # Verifying the PSModulePath location exists + if ((Test-Path -Path $possPath) -eq $true) { + + # Searching for folders with the name of 'VMware.*' + $tempFolder = Get-ChildItem -Path $possPath -Name "VMware.*" + + # If a VMware.* module folder is found, the full path is added to the pcliFolder variable + if ($tempFolder) { + + foreach ($moduleName in $tempFolder) { + $pcliFolder += $possPath + "\" + $moduleName + } + } + + } +} + +# Verifying that there were PowerCLI module folders found +if ($pcliFolder) { + + # Looping through each of the found PowerCLI module folders + foreach ($dir in $pcliFolder) { + + # Variable to be used if there are several PowerCLI module versions available + $historicDir = $null + + # Varibale used to store the PowerCLI module version folder + $tempDir = Get-ChildItem -Path $dir + + # Verifying whether or not there are several PowerCLI module versions available by checking for a type of 'array' + if ($tempDir -is [array]) { + + # Variable used to store the current folder structure + $historicDir = $tempDir + # Updating the tempDir variable to only contain the newest PowerCLI module version folder + $tempDir = $tempDir | Sort-Object Name -Descending | select-Object -First 1 + + } + + # Verifying the child item is indeed a folder + if ($tempDir.GetType().Name -eq "DirectoryInfo") { + + # Obtaining the child objects of the PowerCLI module version folder and copying them to the parent folder + $tempDir | Get-ChildItem | Copy-Item -Destination $dir -ErrorAction Stop + + # Checking for any nested folders within the PowerCLI module version folder + if ($tempDir | Get-ChildItem -Directory) { + + # Obtaining and storing the child items to a variable, then copying the items to the parent folder's nested folder + $nestFolder = $tempDir | Get-ChildItem -Directory + foreach ($nestDir in $nestFolder) { + $nestDir | Get-ChildItem | Copy-Item -Destination ($dir + "\" + $nestDir.Name) -ErrorAction Stop + } + + } + + # Detecting whether the historicDir variable was used + if ($historicDir) { + + # Removing any of the former, no longer needed, directory structure + $historicDir | Remove-Item -Recurse -Force + + } + else { + + # Removing any of the former, no longer needed, directory structure + $tempDir | Remove-Item -Recurse -Force + + } + } + } + +} +else {Write-Host 'No PowerCLI module folders founds in the $PSModulePath directories.'} \ No newline at end of file