Como una alternativa a lo que Jonathan menciona, si tiene módulos de fuente que desea pasar por el cable, puede hacerlo sin demasiados problemas. Si tiene binarios, puede ser capaz de hacer algo similar. Pero yo diría que todas las apuestas están ahí. Esencialmente empuja los archivos como params en un hash, escribe en temp, luego importa.
function Export-SourceModulesToSession
{
Param(
[Management.Automation.Runspaces.PSSession]
[ValidateNotNull()]
$Session,
[IO.FileInfo[]]
[ValidateNotNull()]
[ValidateScript(
{
(Test-Path $_) -and (!$_.PSIsContainer) -and ($_.Extension -eq '.psm1')
})]
$ModulePaths
)
$remoteModuleImportScript = {
Param($Modules)
Write-Host "Writing $($Modules.Count) modules to temporary disk location"
$Modules |
% {
$path = ([IO.Path]::GetTempFileName() + '.psm1')
$_.Contents | Out-File -FilePath $path -Force
"Importing module [$($_.Name)] from [$path]"
Import-Module $path
}
}
$modules = $ModulePaths | % { @{Name = $_.Name; Contents = Get-Content $_ } }
$params = @{
Session = $Session;
ScriptBlock = $remoteModuleImportScript;
Argumentlist = @(,$modules);
}
Invoke-Command @params
}
llamada Al igual que
$session = New-PSSession -ComputerName Foo
Export-SourceModulesToSession $session -ModulePaths '.\module.psm1','.\module2.psm1'
también teóricamente posible, la exportación de una sesión de host local actual al módulo y empujando que sobre el alambre - no probado pseudo-código. Esto podría no funcionar ...
$localSession = New-PSSession #defaults to localhost
# if you don't have modules automatically loading in the profile, etc, then manually load them
Invoke-Command -Computer $localSession -ScriptBlock { Import-Module 'foo'; Import-Module '.\module.ps1' }
Export-PSSession $localSession -OutputModule TempLocalModule
#now that you have TempLocalModule written out, it's possible you can send that thing across the wire in the same way
Me corrigieron. :-) Buen enfoque de tomar la capacidad de importar comandos de la computadora remota y convertirlo en su cabeza para importar desde la computadora local. Por cierto, ¿está importando basado en Path (en lugar de nombre del módulo) porque se encontró con un problema? –
Solo puede importar un módulo por nombre si el archivo del módulo se encuentra en una de las ubicaciones predeterminadas del módulo. Si no es así, debe darle la ruta del archivo. Me encontré con un problema con los módulos de ensamblaje que se importan desde un manifiesto de módulo psd1. La propiedad PSModuleInfo.Path para un módulo binario apunta al dll en lugar de a la psd1. Si importa directamente desde el dll, entonces import-pssession fallará. De ahí todo el vudú para obtener el archivo psd1 para un módulo de ensamblaje. –
¿Todavía usa este método o encontró una forma mejor de hacerlo? – icnivad