包含带有声明变量的Script1,其值将在Script2调用时确定

时间:2014-11-20 08:07:06

标签: powershell scripting scope

在我的PowerShell脚本Main.ps1中,我需要访问变量$script_name$script_path以返回此运行脚本的名称和路径。

在其他地方,我见过这样的事情:

$fullPathIncFileName = $MyInvocation.MyCommand.Definition
$currentScriptName = $MyInvocation.MyCommand.Name
$currentExecutingPath = $fullPathIncFileName.TrimEnd("\"+$currentScriptName)

这很有效。但这是否意味着我需要在每个脚本中放置这么多文本,我想自动获取当前脚本的名称和路径?

我考虑将这3行放在另一个脚本中(名为Variables.ps1,并在需要的任何地方点源。就像这样:

# Main.ps1
. ".\Variables.ps1"

Write-Host $currentScriptName

不幸的是,这仍然会打印" Variables.ps1"

将3行代码放在当前配置文件脚本中会更糟。当然,配置文件脚本变量在控制台启动时运行并僵化,如下所示:$current_time = Get-Date$var = [ANY WINDOWS ENVIRONMENT VARIABLE]放置在配置文件中时,将始终返回控制台启动的时间,甚至当调用脚本运行一周后!

所以我的问题是:如何在我的脚本中通过在其他地方声明它来最简洁地重复使用这样的变量(具有动态值),这样当被调用时,它就会确定"在被召唤时的价值。

1 个答案:

答案 0 :(得分:1)

对于动态更新的值,您需要一个函数:

PS C:\> Get-Content .\source.ps1
function Get-Invocation {
  "Running: {0}" -f $script:MyInvocation.MyCommand.Name
}
PS C:\> Get-Content .\run.ps1
. .\source.ps1
Get-Invocation
PS C:\> .\run.ps1
Running: run.ps1

或至少在脚本中调用的脚本块:

PS C:\> Get-Content .\source.ps1
$invocation = {
  "Running: {0}" -f $script:MyInvocation.MyCommand.Name
}
PS C:\> Get-Content .\run.ps1
. .\source.ps1
Invoke-Command -ScriptBlock $invocation
PS C:\> .\run.ps1
Running: run.ps1