0

我有一个 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()
4

1 回答 1

0

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

可以将变量重置为默认值并从用户/机器范围(在 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以生成新会话并关闭旧会话。

于 2021-04-03T22:28:10.930 回答