【问题标题】:Powershell - How to script a session refresh in powershell?Powershell - 如何在powershell中编写会话刷新脚本?
【发布时间】:2021-06-30 04:11:28
【问题描述】:

我有一个 ps1 脚本来驱动我想要执行的操作。 我在使用命令模式的模块中使用具有类定义的模块。

当我第一次打开 powershell 会话控制台并运行脚本时,一切都很好。

如果我以任何方式更改一个类并在同一个控制台中重新运行,该控制台似乎不会拾取更改后的脚本。我必须关闭 powershell 控制台并重新运行脚本才能使我的更改生效。否则,我只会让脚本的行为与我进行更改之前的行为相同。显然有一些缓存正在进行。

我想知道 MS 是否最终解决了这个问题。我已经阅读了很多关于这方面的抱怨的旧帖子。

我已经尝试了以下方法,但它们似乎都不起作用:

Remove-Variable * -ErrorAction SilentlyContinue; 删除模块 *; $error.Clear(); 清除主机

我什至一起尝试了所有这些。仍然没有帮助。

是否可以采取其他措施来确保加载任何支持模块中的最新代码?必须关闭整个控制台并重新加载是一个严重的生产力问题。

我在做什么的例子:6

using module .\Logger.psm1
using module .\AzurePlatformParmsDefault.psm1   
using module .\AzurePlatform.psm1

[Logger] $Logger = [Logger]::Create()
[AzurePlatformParms] $AzurePlatformParms = [AzurePlatformParmsDefault]::Create( $Logger )
[AzurePlatform] $AzurePlatform = [AzurePlatform]::Create( $Logger, $AzurePlatformParms )

[bool] $Result = $AzurePlatform.Execute()

【问题讨论】:

  • 我通常使用子进程:从pwsh.exe内部打开pwsh.exe,然后退出+重新启动+重新加载根模块
  • 好的,这样就可以回答我关于 MS 是否解决了这个问题的部分问题。您的解决方案可能有效,但它肯定不是一个优雅的解决方案。 MS powershell 很棒,但是这样刷新真的很痛苦。 :D

标签: powershell powershell-5.1


【解决方案1】:

传统观点认为,没有办法在本地执行此操作,而创建新的运行空间或进程就是解决方案。

可以将变量重置为默认值并从用户/机器范围(在 Windows 上)导入环境变量;在清除任何作业、事件、事件订阅者等之前。但这不是真正的会话刷新,类/自定义类型将持续存在。

为了加快您的工作流程,您可能希望在您的$profile 中使用一个可以自动创建新会话并加载所需内容的函数。这种方法可以节省足够的时间,以至于回收交互式会话是微不足道的。我将以我在个人资料中使用的那个为例。它相当全面,但我建议根据您的特定需求量身定制一个。

示例

function Start-NewSession {
    [CmdletBinding(DefaultParameterSetName = 'NoChange')]
    [Alias('sans')]
    param(
        [Alias('N')]
        [switch]
        $NoClose,

        [Parameter(ParameterSetName = 'Elevate')]
        [Parameter(ParameterSetName = 'NoChange')]
        [Alias('nop')]
        [switch]
        $NoProfile,

        [Parameter(ParameterSetName = 'Elevate')]
        [Parameter(ParameterSetName = 'NoChange')]
        [Alias('A')]
        [switch]
        $AddCommands,

        [Parameter(ParameterSetName = 'Elevate')]
        [Alias('E')]
        [switch]
        $Elevate,

        [Parameter(ParameterSetName = 'DeElevate')]
        [Alias('D')]
        [switch]
        $DeElevate
    )
    $PSAppPath = (Get-Process -Id $PID).Path
    $SPParams = @{
        Filepath         = $PSAppPath
        WorkingDirectory = $PWD
        ArgumentList     = ''
    }
    if ($Elevate.IsPresent) {
        $SPParams['Verb'] = 'RunAs'
    }
    elseif ($DeElevate.IsPresent) {
        $SPParams['FilePath'] = Join-Path $env:windir 'explorer.exe'
        $SPParams['ArgumentList'] = $PSAppPath
    }
    if ($NoProfile.IsPresent) {
        $SPParams['ArgumentList'] += ' -NoProfile'
    }
    if ($AddCommands.IsPresent) {
        $ExtraCmds = Read-Host -Prompt 'Post-startup commands'
        if (-not [string]::IsNullOrWhiteSpace($ExtraCmds)) {
            $SPParams['ArgumentList'] +=
            ' -NoExit -Command "' + $ExtraCmds.Replace('"', '\"') + '"'
        }
    }
    if ([string]::IsNullOrWhiteSpace($SPParams['ArgumentList'])) {
        $SPParams.Remove('ArgumentList')
    }
    Start-Process @SPParams
    if (-not $NoClose.IsPresent) { exit }
}

这允许输入sans 来生成新会话并关闭旧会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多