每个脚本的模块范围都会重复
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-Something
将 UserScriptFailed
设置为 $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
}
我有一个模块和脚本,其中 运行 是简单的用户脚本。我想让用户脚本尽可能简单,这就是我使用 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-Something
将 UserScriptFailed
设置为 $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
}