当我编写复杂的PowerShell脚本时,我用来将脚本拆分为单独的文件:
main.ps1
包含逻辑imports\xxxx.ps1
,imports\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