使用圆点符号导入下标时避免覆盖变量

时间:2019-02-13 15:07:46

标签: powershell powershell-v4.0

当我编写复杂的PowerShell脚本时,我用来将脚本拆分为单独的文件:

  • main.ps1包含逻辑
  • imports\xxxx.ps1imports\yyyy.ps1,...以提供自定义功能

main.ps1文件在计算相对于当前目录的路径后,使用dot命令在当前作用域中导入函数。例如:

$CurrentDirectory = Split-Path -Parent $MyInvocation.MyCommand.Definition

. "$CurrentDirectory\Imports\Maths.ps1"

Process-Multiply -x 10 -y 10 # assuming there's a function in the maths.ps1

只要我不覆盖导入脚本中的变量,此方法就起作用。例如,如果我的下标再次声明了$CurrentDirectory变量,则实际上它会覆盖主脚本中的变量。我想这是因为点表示法(与&表示法相反)。

有办法避免这种情况吗?脚本是否可以使用“本地”变量?

这是一个完整的可复制样本:

文件main.ps1

$CurrentDirectory = Split-Path -Parent $MyInvocation.MyCommand.Definition

Write-Host "`$CurrentDirectory from main.ps1 : $CurrentDirectory"

. "$CurrentDirectory\Imports\Maths.ps1"

Write-Host "`$CurrentDirectory from main.ps1 : $CurrentDirectory"

Process-Multiply -x 10 -y 10

文件Imports\Maths.ps1

$CurrentDirectory = Split-Path -Parent $MyInvocation.MyCommand.Definition

function Process-Multiply{
    param(
        [Parameter(Mandatory=$true)][int]$x,
        [Parameter(Mandatory=$true)][int]$y
    )

    $x * $y
}

运行main.ps1脚本时,输出为:

$CurrentDirectory from main.ps1 : C:\temp\xx 
$CurrentDirectory from main.ps1 : C:\temp\xx\Imports 
100

如您所见,$CurrentDirectory变量在子脚本中被覆盖。


PS:我知道我可以在下标中重命名变量,但是在集中式脚本的更大范围内,很难确保变量名的唯一性。

PPS:在现实世界中,我需要当前脚本的目录路径是从c#程序集中加载自定义模块。该程序集位于加载程序脚本的子目录中。

PPPS(!):我必须坚持使用PS v4

0 个答案:

没有答案