Skip to content

Commit 4cdd687

Browse files
author
pldmgg
committed
Significant speed improvements updates to PSCompatibilityFunctions.ps1
1 parent e85c305 commit 4cdd687

File tree

1 file changed

+123
-61
lines changed

1 file changed

+123
-61
lines changed

MyFunctions/PowerShellCore_Compatible/PSCompatibilityFunctions.ps1

+123-61
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,60 @@
1+
function AddWinRMTrustLocalHost {
2+
[CmdletBinding()]
3+
Param (
4+
[Parameter(Mandatory=$False)]
5+
[string]$NewRemoteHost = "localhost"
6+
)
7+
8+
# Make sure WinRM in Enabled and Running on $env:ComputerName
9+
try {
10+
$null = Enable-PSRemoting -Force -ErrorAction Stop
11+
}
12+
catch {
13+
if ($PSVersionTable.PSEdition -eq "Core") {
14+
Import-WinModule NetConnection
15+
}
16+
17+
$NICsWPublicProfile = @(Get-NetConnectionProfile | Where-Object {$_.NetworkCategory -eq 0})
18+
if ($NICsWPublicProfile.Count -gt 0) {
19+
foreach ($Nic in $NICsWPublicProfile) {
20+
Set-NetConnectionProfile -InterfaceIndex $Nic.InterfaceIndex -NetworkCategory 'Private'
21+
}
22+
}
23+
24+
try {
25+
$null = Enable-PSRemoting -Force
26+
}
27+
catch {
28+
Write-Error $_
29+
Write-Error "Problem with Enable-PSRemoting WinRM Quick Config! Halting!"
30+
$global:FunctionResult = "1"
31+
return
32+
}
33+
}
34+
35+
# If $env:ComputerName is not part of a Domain, we need to add this registry entry to make sure WinRM works as expected
36+
if (!$(Get-CimInstance Win32_Computersystem).PartOfDomain) {
37+
$null = reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
38+
}
39+
40+
# Add the New Server's IP Addresses to $env:ComputerName's TrustedHosts
41+
$CurrentTrustedHosts = $(Get-Item WSMan:\localhost\Client\TrustedHosts).Value
42+
[System.Collections.ArrayList][array]$CurrentTrustedHostsAsArray = $CurrentTrustedHosts -split ','
43+
44+
$HostsToAddToWSMANTrustedHosts = @($NewRemoteHost)
45+
foreach ($HostItem in $HostsToAddToWSMANTrustedHosts) {
46+
if ($CurrentTrustedHostsAsArray -notcontains $HostItem) {
47+
$null = $CurrentTrustedHostsAsArray.Add($HostItem)
48+
}
49+
else {
50+
Write-Warning "Current WinRM Trusted Hosts Config already includes $HostItem"
51+
return
52+
}
53+
}
54+
$UpdatedTrustedHostsString = $($CurrentTrustedHostsAsArray | Where-Object {![string]::IsNullOrWhiteSpace($_)}) -join ','
55+
Set-Item WSMan:\localhost\Client\TrustedHosts $UpdatedTrustedHostsString -Force
56+
}
57+
158
function GetModuleDependencies {
259
[CmdletBinding(DefaultParameterSetName="LoadedFunction")]
360
Param (
@@ -83,6 +140,8 @@ function GetModuleDependencies {
83140
}
84141
$ModInfoFromGetCommand = Get-Command -CommandType Cmdlet,Function,Workflow
85142

143+
$CurrentlyLoadedModuleNames = $(Get-Module).Name
144+
86145
[System.Collections.ArrayList]$AutoFunctionsInfo = @()
87146

88147
foreach ($ModInfoObj in $ModInfoFromManifests) {
@@ -92,18 +151,51 @@ function GetModuleDependencies {
92151
ManifestFileItem = $ModInfoObj.ManifestFileItem
93152
ExportedCommands = $ModInfoObj.ExportedCommands
94153
}
95-
$null = $AutoFunctionsInfo.Add($PSObj)
154+
155+
if ($NameOfLoadedFunction) {
156+
if ($PSObj.ModuleName -ne $NameOfLoadedFunction -and
157+
$CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
158+
) {
159+
$null = $AutoFunctionsInfo.Add($PSObj)
160+
}
161+
}
162+
if ($PathToScriptFile) {
163+
$ScriptFileItem = Get-Item $PathToScriptFile
164+
if ($PSObj.ModuleName -ne $ScriptFileItem.BaseName -and
165+
$CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
166+
) {
167+
$null = $AutoFunctionsInfo.Add($PSObj)
168+
}
169+
}
96170
}
97171
}
98172
foreach ($ModInfoObj in $ModInfoFromGetCommand) {
99173
$PSObj = [pscustomobject]@{
100174
ModuleName = $ModInfoObj.ModuleName
101175
ExportedCommands = $ModInfoObj.Name
102176
}
103-
$null = $AutoFunctionsInfo.Add($PSObj)
177+
178+
if ($NameOfLoadedFunction) {
179+
if ($PSObj.ModuleName -ne $NameOfLoadedFunction -and
180+
$CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
181+
) {
182+
$null = $AutoFunctionsInfo.Add($PSObj)
183+
}
184+
}
185+
if ($PathToScriptFile) {
186+
$ScriptFileItem = Get-Item $PathToScriptFile
187+
if ($PSObj.ModuleName -ne $ScriptFileItem.BaseName -and
188+
$CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
189+
) {
190+
$null = $AutoFunctionsInfo.Add($PSObj)
191+
}
192+
}
104193
}
105194

106-
$AutoFunctionsInfo = $AutoFunctionsInfo| Where-Object {![string]::IsNullOrWhiteSpace($_) -and $_.ManifestFileItem -ne $null}
195+
$AutoFunctionsInfo = $AutoFunctionsInfo | Where-Object {
196+
![string]::IsNullOrWhiteSpace($_) -and
197+
$_.ManifestFileItem -ne $null
198+
}
107199

108200
$FunctionRegex = "([a-zA-Z]|[0-9])+-([a-zA-Z]|[0-9])+"
109201
$LinesWithFunctions = $($FunctionOrScriptContent -split "`n") -match $FunctionRegex | Where-Object {![bool]$($_ -match "[\s]+#")}
@@ -195,6 +287,8 @@ function InvokePSCompatibility {
195287
return
196288
}
197289

290+
AddWinRMTrustLocalHost
291+
198292
if (!$InvocationMethod) {
199293
$MyInvParentScope = Get-Variable "MyInvocation" -Scope 1 -ValueOnly
200294
$PathToFile = $MyInvParentScope.MyCommand.Source
@@ -360,7 +454,7 @@ function InvokePSCompatibility {
360454
foreach ($ModuleName in $ModulesNotFoundLocally) {
361455
try {
362456
if (![bool]$(Get-Module -ListAvailable $ModuleName) -and $InstallModulesNotAvailableLocally) {
363-
Install-Module $ModuleName -Force -ErrorAction Stop -WarningAction SilentlyContinue
457+
Install-Module $ModuleName -AllowClobber -Force -ErrorAction Stop -WarningAction SilentlyContinue
364458
$null = $ModulesSuccessfullyInstalled.Add($ModuleName)
365459
}
366460

@@ -385,7 +479,7 @@ function InvokePSCompatibility {
385479

386480
$ManifestFileItem = Invoke-WinCommand -ComputerName localhost -ScriptBlock {
387481
if (![bool]$(Get-Module -ListAvailable $args[0]) -and $args[1]) {
388-
Install-Module $args[0] -Force
482+
Install-Module $args[0] -AllowClobber -Force
389483
}
390484
$(Get-Item $(Get-Module -ListAvailable $args[0]).Path)
391485
} -ArgumentList $ModuleName,$InstallModulesNotAvailableLocally -ErrorAction Stop -WarningAction SilentlyContinue
@@ -408,9 +502,9 @@ function InvokePSCompatibility {
408502
}
409503
}
410504

411-
if ($ModulesNotFoundLocally.Count -ne $ModulesSuccessfullyInstalled -and !$InstallModulesNotAvailableLocally) {
505+
if ($ModulesNotFoundLocally.Count -ne $ModulesSuccessfullyInstalled.Count -and !$InstallModulesNotAvailableLocally) {
412506
$ErrMsg = "The following Modules were not found locally, and they will NOT be installed " +
413-
"because the -InstallModulesNotAvailableLocally switch was not used:`n$($ModulesNotFOundLocally -join "`n")"
507+
"because the -InstallModulesNotAvailableLocally switch was not used:`n$($ModulesNotFoundLocally -join "`n")"
414508
Write-Error $ErrMsg
415509
Write-Warning "No Modules have been Imported or Installed!"
416510
$global:FunctionResult = "1"
@@ -438,24 +532,7 @@ function InvokePSCompatibility {
438532
$_.ModuleName -eq $ModObj.ModuleName
439533
}
440534

441-
$AllVersionsPrep = $MatchingModObjs.ManifestFileItem.FullName | Split-Path -Parent
442-
443-
$AllVersions = foreach ($PotentialVersionPath in $AllVersionsPrep) {
444-
$PotentialVersionString = $PotentialVersionPath | Split-Path -Leaf
445-
446-
$VersionCheck = [bool]$(
447-
try{
448-
[version]$PotentialVersionString
449-
}
450-
catch{
451-
Write-Verbose "'$PotentialVersionString' is not a version number..."
452-
}
453-
)
454-
455-
if ($VersionCheck) {
456-
$PotentialVersionString
457-
}
458-
}
535+
$AllVersions = $MatchingModObjs.ManifestFileItem.FullName | foreach {$(Import-PowerShellDataFile $_).ModuleVersion} | foreach {[version]$_}
459536

460537
if ($AllVersions.Count -gt 1) {
461538
$VersionsSorted = $AllVersions | Sort-Object | Get-Unique
@@ -464,8 +541,8 @@ function InvokePSCompatibility {
464541
$VersionsToRemove = $VersionsSorted[0..$($VersionsSorted.Count-2)]
465542

466543
foreach ($Version in $($VersionsToRemove | foreach {$_.ToString()})) {
467-
[array]$ModObjsToRemove = $RequiredLocallyAvailableModulesScan.PSCoreModuleDependencies | Where-Object {
468-
$_.ManifestFileItem.FullName -match "\\$Version\\" -and $_.ModuleName -eq $ModObj.ModuleName
544+
[array]$ModObjsToRemove = $MatchingModObjs | Where-Object {
545+
$(Import-PowerShellDataFile $_.ManifestFileItem.FullName).ModuleVersion -eq $Version -and $_.ModuleName -eq $ModObj.ModuleName
469546
}
470547

471548
foreach ($obj in $ModObjsToRemove) {
@@ -481,24 +558,7 @@ function InvokePSCompatibility {
481558
$_.ModuleName -eq $ModObj.ModuleName
482559
}
483560

484-
$AllVersionsPrep = $MatchingModObjs.ManifestFileItem.FullName | Split-Path -Parent
485-
486-
$AllVersions = foreach ($PotentialVersionPath in $AllVersionsPrep) {
487-
$PotentialVersionString = $PotentialVersionPath | Split-Path -Leaf
488-
489-
$VersionCheck = [bool]$(
490-
try{
491-
[version]$PotentialVersionString
492-
}
493-
catch{
494-
Write-Verbose "'$PotentialVersionString' is not a version number..."
495-
}
496-
)
497-
498-
if ($VersionCheck) {
499-
$PotentialVersionString
500-
}
501-
}
561+
$AllVersions = $MatchingModObjs.ManifestFileItem.FullName | foreach {$(Import-PowerShellDataFile $_).ModuleVersion} | foreach {[version]$_}
502562

503563
if ($AllVersions.Count -gt 1) {
504564
$VersionsSorted = $AllVersions | Sort-Object | Get-Unique
@@ -507,8 +567,8 @@ function InvokePSCompatibility {
507567
$VersionsToRemove = $VersionsSorted[0..$($VersionsSorted.Count-2)]
508568

509569
foreach ($Version in $($VersionsToRemove | foreach {$_.ToString()})) {
510-
[array]$ModObjsToRemove = $RequiredLocallyAvailableModulesScan.WinPSModuleDependencies | Where-Object {
511-
$_.ManifestFileItem.FullName -match "\\$Version\\" -and $_.ModuleName -eq $ModObj.ModuleName
570+
[array]$ModObjsToRemove = $MatchingModObjs | Where-Object {
571+
$(Import-PowerShellDataFile $_.ManifestFileItem.FullName).ModuleVersion -eq $Version -and $_.ModuleName -eq $ModObj.ModuleName
512572
}
513573

514574
foreach ($obj in $ModObjsToRemove) {
@@ -520,6 +580,7 @@ function InvokePSCompatibility {
520580

521581
#endregion >> Prep
522582

583+
$RequiredLocallyAvailableModulesScan
523584

524585
#region >> Main
525586

@@ -529,8 +590,9 @@ function InvokePSCompatibility {
529590
[System.Collections.ArrayList]$SuccessfulModuleImports = @()
530591
[System.Collections.ArrayList]$FailedModuleImports = @()
531592
foreach ($ModObj in $RequiredLocallyAvailableModulesScan.PSCoreModuleDependencies) {
593+
Write-Verbose "Attempting import of $($ModObj.ModuleName)..."
532594
try {
533-
Import-Module $ModObj.ModuleName -Scope Global -NoClobber -Force -ErrorAction Stop
595+
Import-Module $ModObj.ModuleName -Scope Global -NoClobber -Force -ErrorAction Stop -WarningAction SilentlyContinue
534596

535597
$ModuleInfo = [pscustomobject]@{
536598
ModulePSCompatibility = "PSCore"
@@ -547,7 +609,7 @@ function InvokePSCompatibility {
547609
Write-Verbose "Problem importing module '$($ModObj.ModuleName)'...trying via Manifest File..."
548610

549611
try {
550-
Import-Module $ModObj.ManifestFileItem.FullName -Scope Global -NoClobber -Force -ErrorAction Stop
612+
Import-Module $ModObj.ManifestFileItem.FullName -Scope Global -NoClobber -Force -ErrorAction Stop -WarningAction SilentlyContinue
551613

552614
$ModuleInfo = [pscustomobject]@{
553615
ModulePSCompatibility = "PSCore"
@@ -593,7 +655,7 @@ function InvokePSCompatibility {
593655
}
594656

595657
Invoke-WinCommand -ComputerName localhost -ScriptBlock {
596-
Import-Module $args[0] -Scope Global -NoClobber -Force
658+
Import-Module $args[0] -Scope Global -NoClobber -Force -WarningAction SilentlyContinue
597659
} -ArgumentList $ModObj.ModuleName -ErrorAction Stop
598660

599661
$ModuleInfo = [pscustomobject]@{
@@ -640,7 +702,7 @@ function InvokePSCompatibility {
640702
}
641703

642704
Invoke-WinCommand -ComputerName localhost -ScriptBlock {
643-
Import-Module $args[0] -Scope Global -NoClobber -Force
705+
Import-Module $args[0] -Scope Global -NoClobber -Force -WarningAction SilentlyContinue
644706
} -ArgumentList $ModObj.ManifestFileItem.FullName -ErrorAction Stop
645707

646708
$ModuleInfo = [pscustomobject]@{
@@ -865,7 +927,7 @@ function InvokeModuleDependencies {
865927
if (![bool]$(Get-Module -ListAvailable $ModuleName) -and $InstallModulesNotAvailableLocally) {
866928
# Install the Module
867929
try {
868-
$null = Install-Module $ModuleName -Force -ErrorAction Stop -WarningAction SilentlyContinue
930+
$null = Install-Module $ModuleName -AllowClobber -Force -ErrorAction Stop -WarningAction SilentlyContinue
869931
}
870932
catch {
871933
Write-Error $_
@@ -910,8 +972,8 @@ function InvokeModuleDependencies {
910972
# SIG # Begin signature block
911973
# MIIMiAYJKoZIhvcNAQcCoIIMeTCCDHUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
912974
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
913-
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUVmxhqCLT0ej4/cdxf5UPkG4O
914-
# 9o2gggn9MIIEJjCCAw6gAwIBAgITawAAAB/Nnq77QGja+wAAAAAAHzANBgkqhkiG
975+
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU0ft8F2StAHKvZEH3xRfg0eIe
976+
# Plegggn9MIIEJjCCAw6gAwIBAgITawAAAB/Nnq77QGja+wAAAAAAHzANBgkqhkiG
915977
# 9w0BAQsFADAwMQwwCgYDVQQGEwNMQUIxDTALBgNVBAoTBFpFUk8xETAPBgNVBAMT
916978
# CFplcm9EQzAxMB4XDTE3MDkyMDIxMDM1OFoXDTE5MDkyMDIxMTM1OFowPTETMBEG
917979
# CgmSJomT8ixkARkWA0xBQjEUMBIGCgmSJomT8ixkARkWBFpFUk8xEDAOBgNVBAMT
@@ -968,11 +1030,11 @@ function InvokeModuleDependencies {
9681030
# ARkWA0xBQjEUMBIGCgmSJomT8ixkARkWBFpFUk8xEDAOBgNVBAMTB1plcm9TQ0EC
9691031
# E1gAAAH5oOvjAv3166MAAQAAAfkwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwx
9701032
# CjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC
971-
# NwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFDaKC57oFZDELs5G
972-
# t32Xr2aKYNAFMA0GCSqGSIb3DQEBAQUABIIBAAfBhhnRJRcN1tZpvUh17Q5liJTy
973-
# a0RAZCTjM/qa6ZeEIUvx4RFFYHhIStE8wzvy/95frpK47cvYgGnz4tLm9Vk+bg45
974-
# C5d6KrYBvFWF5n53uOjlo46GyaRaI/aQ/G0UDXMt3iU9ESY2HAe3BExWKst2iNvP
975-
# VyRxbrop55EOx6Iojg7AfANMIUsjDK9z1EPRO3MZlIhPMxH0EsL463mXEwPHH+i3
976-
# igMPBo26I1n71ECw8J35MEc7ouk9HdXgHKsYo1txdHRXlDWvv1GMl/Dp4jRqzeu5
977-
# y7+/PRfrjUo0hc51zLiUtiJhP9+8xa9C3NRgcElrg50UQWvrXjXnO7BIGmo=
1033+
# NwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFMitP2lxEMl7N8rR
1034+
# ruFsL9Knvq2gMA0GCSqGSIb3DQEBAQUABIIBAE69J2OC+UdfuTYP8AsOJMkHrr0i
1035+
# 2b8UxBnzujnain9iK7nasDA57ui1if0RFLkCqMlD/4LT/BabjBa7LZ2kZdvZ9raQ
1036+
# A5h3vCzGggoPVySz2w9PXXf64YgcUvG/k1anX2ejlxV+gRcSy2SsuemPX6JZPVy7
1037+
# UfSG+Bn/pym4zL0k12HSjZLtSUtTSkE370cWrlBUEX8Kx0SUH+YFX/2f4mUc050R
1038+
# A+vqKVqBsFxKMFvXko/ckllD9ST5orAiFW04VwCqtmYKGxRvQ7RYD40k52xawDLM
1039+
# 3u/GBIe2AwfZeU0ejNwmaZZNpVRYyqNcHbrqd0WRSCJqg8eJAOTpewUu+z8=
9781040
# SIG # End signature block

0 commit comments

Comments
 (0)