点源脚本时PowerShell范围冲突

wen*_*een 5 powershell scope

点采购Powershell脚本时遇到一些范围问题。假设我有一个脚本“ A.ps1”:

$VERSION = "1.0"

# Dot source B.ps1
. .\B.ps1

function Write-Version { Write-Host "A.ps1 version $VERSION" }
Write-Version
Run Code Online (Sandbox Code Playgroud)

和脚本B.ps1

$VERSION = "2.0"
function Write-Version { Write-Host "B.ps1 version $VERSION" }
Write-Version
Run Code Online (Sandbox Code Playgroud)

运行A.ps1的输出将是:

B.ps1 version 2.0
A.ps1 version 2.0
Run Code Online (Sandbox Code Playgroud)

为什么发生这种情况非常明显。$VERSION来自B.ps1 的变量被放入A.ps1的范围,并覆盖该变量。的确确实发生了这种情况Write-Version,但是这里A.ps1覆盖了B的版本,但是由于Write-Version在此之前在B.ps1中被调用,我们仍然可以看到B的Write-Version函数的输出。

当然,问题是如何防止这种情况发生?我尝试了各种示波器选项,但是在点源采购时似乎不起作用。而且由于B.ps1中有我在A的作用域中确实需要的功能,因此仅调用B.ps1可能不是一种选择。

有人有什么想法吗?

Ryn*_*ant 3

您可以通过将 B.ps1 设为模块并将其重命名为 B.psm1 来完成此操作。添加Export-ModuleMember以使您的函数可供其他脚本使用。

这将是 B.psm1:

$VERSION = "2.0"
function Write-Version { Write-Host "B.ps1 version $VERSION" }
Write-Version

# Only items specified here will be exported. If Export-ModuleMember is not used,
# ALL members (functions, variables, and aliases) will be exported. In this case
# if $VERSION was exported, $VERSION will be set to "2.0" in script A.ps1
Export-ModuleMember -Function Write-Version
Run Code Online (Sandbox Code Playgroud)

A.ps1 是:

$VERSION = "1.0"

# Import B.psm1
Import-Module .\B.psm1

function Write-Version { Write-Host "A.ps1 version $VERSION" }
Write-Version

# Use B.psm1's `Write-Version` function
B\Write-Version
Run Code Online (Sandbox Code Playgroud)