0
点赞
收藏
分享

微信扫一扫

powershell@批量重新导入模块@刷新发生了变更的模块@ipmof



文章目录

  • abstract


abstract

  • 由于同一个会话下,powershell无法自动更新已经导入但发生变化的模块,这时候用户有两个选择:
  • 重新执行pwsh,或者使用ipmo(Import-Module) 配合-Force参数强制重载相应的模块
  • 前者重载得彻底,但是会无法继承父级会话中的环境,比如定义的变量在新开的pwsh中无法访问,而且开销比较大,速度慢
  • 后者一种方法更加轻量,由于不会创建新的pwsh进程,不会造成环境变量丢失,但是一个个检查模块然后重新加载对于开发者来说不方便
  • 为此编写了以下函数,可以直接重载已经加载了的模块,方便了这一个刷新变更了的模块的过程
  • NOTES
  • 一个有意思的现象是,如果自动导入模块的路径$PsModulePath下的模块如果在当前powershell会话中没有加载,例如某个函数x在模块test中
  • 而当前shell环境没有调用x,也没有调用模块test中的任意函数,或定义的东西,此时对此摸块做了更改后,不需要刷新,在当前会话shell中调用test的变更的内容是自动更新的,也就是说会自动刷新
  • 总结:可以重载已经加载了的模块,对于开发测试powershell模块很有用

function Import-ModuleForce
{
    <# 
    .SYNOPSIS
    默认重载已经加载了的模块,而不是重载所有模块来加快操作速度
    #>
    [CmdletBinding()]
    param (
        # [switch]$PassThru
    )

    # 获取当前 已经加载了的模块
    $modules = Get-Module | Select-Object -ExpandProperty Name

    $res = @()
    foreach ($module in $modules)
    {
        # 跳过某些模块的重载(如果这个模块比较特殊的话,比如包含注册补全的模块,这个模块就要谨慎重载,默认跳过,可以根据自己的情况调整)
        # Remove-Module $module -ErrorAction SilentlyContinue -Force
        # if ($module -like '*completion*')
        # { 
        #     Write-Warning "Skipping $module"
        #     continue 
        # }

        # Import-Module $module -Force -WarningAction SilentlyContinue -ErrorAction SilentlyContinue
        $exp = "Import-Module $module -Force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue"
        $res += $exp
        Write-Verbose "Imported $module "
    }
    # if ($PassThru)
    # {

    #     return $res -join "`n"
    # }
    return $res -join "`n"
}
function ipmof
{
    <# 
    .SYNOPSIS
    作为Import-ModuleForce的别名
    由于同一个会话下,powershell无法自动更新发生变化的模块,这时候用户有两个选择:
    重新执行pwsh,或者使用ipmo(Import-Module) 配合-Force参数强制重载相应的模块
    前者重载得彻底,但是会无法继承父级会话中的环境,比如定义的变量在新开的pwsh中无法访问,而且开销比较大,速度慢
    后者一种方法更加轻量,由于不会创建新的pwsh进程,不会造成环境变量丢失,但是一个个检查模块然后重新加载对于开发者来说不方便
    为此编写了此函数,可以直接重载已经加载了的模块,方便了这一个刷新变更了的模块的过程
    .NOTES
    一个有意思的现象是,如果自动导入模块的路径$PsModulePath下的模块如果在当前powershell会话中没有加载,例如某个函数x在模块test中
    而当前shell环境没有调用x,也没有调用模块test中的任意函数,或定义的东西,此时对此摸块做了更改后,不需要刷新,在当前会话shell中调用test的变更的内容是自动更新的,也就是说会自动刷新
    可以重载已经加载了的模块,对于开发测试powershell模块很有用
    .Notes
    本函数调用要配合iex,效果比较稳定,如果你的模块比价简单,那么可以更改import-ModuleForce内部让其直接执行强制导入
    .EXAMPLE
    重载已经加载了的模块:
    ipmof|iex
    .ExAMPLE
    Import-ModuleForce -verbose|iex

    #>
    param (
    )
    # Import-Module PSReadLine -Force
    Import-ModuleForce
    
}


举报

相关推荐

0 条评论