gpt4 book ai didi

powershell - 在不继承变量和范围的情况下从另一个运行一个 PowerShell 脚本

转载 作者:行者123 更新时间:2023-12-02 23:33:10 26 4
gpt4 key购买 nike

通常在 PowerShell 中这是有效的:

# parent.ps1

$x = 1
&"$PSScriptRoot/child.ps1"

# child.ps1

Write-Host $x

parent.ps1运行,它打印出 1自从 child.ps1继承了它。

我可以为我的脚本防止这种情况吗?

我可以做 $private:x = 1 ,但 parent 有很多变量,所以它很冗长且容易出错。

有没有办法调用 child.ps1没有继承范围?
或者也许是一种在父级私有(private)中标记所有内容的方法?

最佳答案

不,没有使用 $private: 定义调用范围(及其祖先范围)中的所有变量范围,您不能阻止 PowerShell 的动态范围。

也就是说,在给定范围内创建变量(没有 $private: )使其对其所有后代范围可见,例如脚本(直接调用或通过 & 调用)运行的子范围。

此外,某些自动(内置)变量是使用选项 AllScope 定义的。 ,这总是使它们在所有范围内可见,而不仅仅是后代范围。

解决方法 :

  • 进行中:
  • 通过线程作业调用您的脚本,使用 Start-ThreadJob (PowerShell v6+) 或使用 ForEach-Object -Parallel (v7+);例如。:
  • ForEach-Object -Parallel { $PSScriptRoot/child.ps1 }
  • 线程作业和 ForEach-Object -Parallel 创建的线程不要继承调用者的状态(v7+ 中的当前位置除外)[1]。
  • 在脚本的开头,通过 Get-Variable 枚举所有变量并创建您明确设置为 $null 的本地副本(您需要忽略源自无法覆盖的内置变量的错误) - 这将有效地隐藏祖先范围内的变量。
  • 进程外:
  • 通过新的 PowerShell 进程(powershell -File ...pwsh -File ...)或后台作业(使用 Start-Job)调用您的脚本。
  • 警告:除了性能下降之外,由于跨进程的 XML 序列化序列化类型保真度可能会丢失 - 请参阅 this answer详情。


  • [1] 请注意,提供选择加入以将调用者的状态复制到 ForEach-Object -Parallel现在正在考虑线程;见 this GitHub feature request .

    关于powershell - 在不继承变量和范围的情况下从另一个运行一个 PowerShell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61845451/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com