每个脚本的模块范围都会重复

Module scope gets duplicated for every script

我有一个模块和脚本,其中 运行 是简单的用户脚本。我想让用户脚本尽可能简单,这就是我使用 Import-Module-Global 标志的原因。我对模块 "private" 变量有疑问。在我的例子中,我有这个变量的 2 个副本。我可以只实现一份吗?[=​​23=]

下面是一个简单的例子。您可以 运行 通过将 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-SomethingUserScriptFailed 设置为 $true。但是一旦 UserScript.ps1 完成,ScriptRunner.ps1 就会看到 $false 值。

输出:

Write-Var output: True
ScriptRunner output: False

您可以尝试点源您要检查的脚本:

function Invoke-UserScript
{
    param($Path)

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