点采购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可能不是一种选择。
有人有什么想法吗?
您可以通过将 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)