Область действия модуля дублируется для каждого скрипта - PullRequest
0 голосов
/ 13 мая 2019

У меня есть модуль и скрипт, который запускает простые пользовательские скрипты.Я хочу, чтобы пользовательский сценарий был максимально простым, и поэтому я использую Import-Module с флагом -Global.У меня проблема с модулем «закрытая» переменная.В моем случае у меня есть 2 копии этой переменной.Можно ли получить только одну копию?

Ниже приведен простой пример.Вы можете запустить, поместив 3 файла в одну папку и выполнив ScriptRunner.ps1.

Module.psm1

function Invoke-UserScript
{
    param($Path)

    $Script:UserScriptFailed = $false
    & $Path
    return $Script:UserScriptFailed
}

function New-Something
{
    $Script:UserScriptFailed = $true
}

function Write-Var
{
    Write-Host "Write-Var output: $Script:UserScriptFailed"
}

Export-ModuleMember -Function Invoke-UserScript
Export-ModuleMember -Function New-Something
Export-ModuleMember -Function Write-Var

ScriptRunner.ps1

Set-Location $PSScriptRoot
Import-Module -Name (Resolve-Path '.\Module.psm1') -Global
$failed = Invoke-UserScript -Path '.\UserScript.ps1'
Write-Output "ScriptRunner output: $failed"

UserScript.ps1

New-Something
Write-Var

В моем примере функция New-Something устанавливает UserScriptFailed в $true.Но как только UserScript.ps1 заканчивается, ScriptRunner.ps1 видит $false значение.

Вывод:

Write-Var output: True
ScriptRunner output: False

1 Ответ

1 голос
/ 13 мая 2019

Вы можете попытаться указать исходный текст сценария, который вы хотите проверить:

function Invoke-UserScript
{
    param($Path)

    $Script:UserScriptFailed = $false
    # Sourcing may add the functions to the current scope
    . $Path
    & $Path
    return $Script:UserScriptFailed
}
...