PowerShell文件在隐式远程处理的上下文中键入ps1 vs psm1

时间:2017-02-16 14:23:13

标签: powershell

摘要

我目前正在集中PowerShell脚本。大量用户可以使用隐式远程访问来访问这些脚本。

问题:

使用psm1比ps1更有效吗?鉴于下面的设置和脚本的结构?

自动化隐式远程处理的示例脚本:(请注意导入的模块是ps1)

$poshSession = New-PSSession -ComputerName serverA -Authentication Kerberos -ConfigurationName poshconfig
Set-Alias -Name rs -Value Resolve-RemotingSession -Description 'Resolves and imports sessions and obtains specific commands'
function Resolve-RemotingSession
{ 
  # Import Modules
  Invoke-command -ScriptBlock { Import-Module -Name 'ModuleA.ps1' } -Session $poshSession
  Invoke-command -ScriptBlock { Import-Module -Name 'ModuleB.ps1' } -Session $poshSession
  Invoke-command -ScriptBlock { Import-Module -Name 'ModuleC.ps1' } -Session $poshSession
  Invoke-Command -ScriptBlock { Import-Module -Name 'ModuleD.ps1' } -Session $poshSession
  Import-PSSession -Session $poshSession -commandname *CommandA,CommandB,CommandC,CommandD* -AllowClobber
}

其中一个导入脚本的示例...请注意,每个ps1脚本都有大约15到20个结构,其结构类似于以下内容:

function Get-FooBarA{
param(
[switch]$Search,
[string]$Term
)
$foobarResults = Invoke-Restmethod -method Get -Uri www.fooA.com/$Search/$term
$foobaresults.Something
}

function Get-FooBarB{
param(
[switch]$Search,
[string]$Term
)
$foobarResults = Invoke-Restmethod -method Get -Uri www.fooB.com/$Search/$term
$foobaresults.Something
}

据我所知,这个设置可能是资源密集型的,我强迫用户在每次使用.ps1脚本设置会话时导入脚本。

如果我决定使用.psm1文件扩展名(将这些扩展名转换为模块)有没有办法保持这些模块的持久导入,以便我可以从启动PS会话的脚本中删除以下命令?

Invoke-command -ScriptBlock { Import-Module -Name 'ModuleA.ps1' } -Session $poshSession

1 个答案:

答案 0 :(得分:1)

我不确定你的意思是什么更高效,但让我指出一些事情:

  1. Use well-formed modules,即为您的模块创建正确的目录结构,使用.psm1模块文件和.psd1模块清单。
  2. 确保模块位于模块路径中的路径中(参见上面的链接)。这种方式可以通过名称导入而无需完整路径信息。
  3. 使用Import-PSSession时,您可以使用-Module ModuleA,ModuleB仅导入指定模块导出的命令(完全不使用-command),而不是导入单个命令。
  4. 您可以通过一次调用Invoke-Command来运行多个命令。它需要一个scriptblock;你可以将整个程序放在那里,所以没有理由进行多个单独的调用来导入多个模块。
  5. 但是,Import-Module可以导入多个模块:Import-Module -Name ModuleA,ModuleB,ModuleC
  6. Using a session configuration将允许您指定自动加载的模块,以便您可以直接远程进入预先配置的会话。