【问题标题】:Dot Sourced Variables VS Global Variables点源变量 VS 全局变量
【发布时间】:2017-07-11 20:02:11
【问题描述】:

我有两种方法可以从单独的脚本文件中引用脚本变量。以下是两个基本示例:

1.点源
变量.ps1

$Source = "source"  
$Destination = "dest"

执行.ps1

. .\Variables.ps1  
Copy-Item -Path $Source -Destination $Destination -Force

2。全局变量
变量.ps1

$Global:Source = "source"  
$Global:Destination = "dest"

执行.ps1

.\Variables.ps1  
Copy-Item -Path $Source -Destination $Destination -Force

我已经进行了研究,但还没有找到一个明确的理由来使用一个而不是另一个。使用这些方法时我应该注意哪些限制或注意事项?非常感谢任何输入。感谢您的宝贵时间。

编辑:

@mklement0 给出了一个很好的答案,为什么要在全局变量上使用点源。我希望仍然保持这个讨论的开放性。如果有另一种观点,或者关于何时使用全局变量更有益的解释,我会很高兴听到它并相应地投票。谢谢。

【问题讨论】:

    标签: powershell variables file-copying


    【解决方案1】:

    我建议你使用点源,没有显式的全局变量(方法 1):

    这样,需要刻意努力将变量添加到当前范围。请注意,点源将变量添加到 current 范围,该范围可能是也可能不是当前会话的 global 范围(子范围是通过调用脚本创建的(没有 dot-源)和带有& 的脚本块,例如)。

    相比之下,使用全局变量(方法 2)创建会话全局变量无论调用方法如何,因此即使是脚本的意外、非点源调用最终也会改变 全局状态。

    【讨论】:

    • 有趣。现在,当多个脚本文件引用变量脚本文件时,您仍然建议点源吗?什么时候使用全局变量更有益?
    • @Ethilium:是的,让所有这些脚本文件明确地点源变量文件 - 在依赖这些变量的脚本的上下文中清楚地传达意图 - 并避免不必要的副作用。老实说,我不知道全局变量是正确选择的用例(但如果有这种情况,我很想听听它们)。请注意,下一个抽象级别是创建一个 module,您的脚本 import.
    • 感谢您的详细解释和简洁的回答。我还将进一步研究创建模块。标记为正确答案。
    • 似乎在 PowerShell 6 中,您无法访问在点源脚本中创建的变量。
    • @mklement0 抱歉回复晚了。我的问题是一个与将导入库中的对象分配给点源脚本中的变量有关的错误。我的意图是重现问题并在有时间时报告错误,但我无法重现它,我没有时间进一步尝试。全局变量是我使用的一种解决方法。
    猜你喜欢
    • 2021-03-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2019-07-24
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多