PSAdapter.psm1
|
$commandsPath = Join-Path $PSScriptRoot .\Commands :ToIncludeFiles foreach ($file in (Get-ChildItem -Path "$commandsPath" -Filter "*-*" -Recurse)) { if ($file.Extension -ne '.ps1') { continue } # Skip if the extension is not .ps1 foreach ($exclusion in '\.[^\.]+\.ps1$') { if (-not $exclusion) { continue } if ($file.Name -match $exclusion) { continue ToIncludeFiles # Skip excluded files } } . $file.FullName } $myModule = $MyInvocation.MyCommand.ScriptBlock.Module $ExecutionContext.SessionState.PSVariable.Set($myModule.Name, $myModule) $myModule.pstypenames.insert(0, $myModule.Name) New-PSDrive -Name $MyModule.Name -PSProvider FileSystem -Scope Global -Root $PSScriptRoot -ErrorAction Ignore if ($home) { $MyModuleProfileDirectory = Join-Path $home $MyModule.Name if (-not (Test-Path $MyModuleProfileDirectory)) { $null = New-Item -ItemType Directory -Path $MyModuleProfileDirectory -Force } New-PSDrive -Name "My$($MyModule.Name)" -PSProvider FileSystem -Scope Global -Root $MyModuleProfileDirectory -ErrorAction Ignore } $KnownVerbs = Get-Verb | Select-Object -ExpandProperty Verb # Set a script variable of this, set to the module # (so all scripts in this scope default to the correct `$this`) $script:this = $myModule $myScriptTypeCommands = foreach ($myScriptType in $myModule.Name) { $myTypeData = Get-TypeData $myScriptType if (-not $myTypeData.Members) { continue } foreach ($myMemberInfo in $myTypeData.Members.GetEnumerator()) { $myMemberName = $myMemberInfo.Key $myMember = $myMemberInfo.Value if ($myMember -is [Management.Automation.Runspaces.ScriptMethodData]) { $myFunctionName = if ($myMemberName -in $KnownVerbs) { "$($myMemberName)-$($myScriptType)" } else { "$($myScriptType).$($myMemberName)" } # Declare My Function "function $myFunctionName { $($myMember.Script) }" if ($myMemberName -in $KnownVerbs) { # Alias it if it's a known verb, so both verb and noun form are available. "Set-Alias -Name '$($myScriptType).$($myMemberName)' -Value '$myFunctionName'" } "Set-Alias -Name '$($myMemberName).$($myScriptType)' -Value '$myFunctionName'" } } } . ([ScriptBlock]::Create($myScriptTypeCommands -join [Environment]::NewLine)) #region Custom $adapterTemplateType = (Get-TypeData -TypeName 'PSAdapter.Template') foreach ($CSharpTypeName in $adapterTemplateType.Members.Keys -match '\.cs') { $compileError = $null Add-Type -PassThru -TypeDefinition $adapterTemplateType.Members[$CSharpTypeName].Value -ErrorAction SilentlyContinue -ErrorVariable compileError if ($compileError) { Write-Warning "$compileError" } } $accelerators = [psobject].assembly.gettype("System.Management.Automation.TypeAccelerators") foreach ($classScript in @(Get-ChildItem -Path ($myModule.Path | Split-Path) -File -Recurse) -match '\.class\.ps1') { $classScriptFile = $ExecutionContext.SessionState.InvokeCommand.GetCommand($classScript.FullName, 'ExternalScript') $classNamesInFile = $classScriptFile.ScriptBlock.Ast.FindAll({param($ast) $ast -is [Management.Automation.Language.TypeDefinitionAst]}, $false).Name . $classScript.FullName foreach ($className in $classNamesInFile) { $accelerators::Remove($className) $accelerators::Add($className, ($className -as [type])) } } #endregion Custom Export-ModuleMember -Alias * -Function * -Variable $myModule.Name |