范围vs Runspace vs Session vs AppDomain

neu*_*990 9 powershell session appdomain runspace

我正在努力为PowerShell划清界限.我的理解非常有限:

  • 范围包含用户/脚本定义的变量和函数,并且可以存在具有PS调用堆栈的范围层次结构.
  • Runspace规定了给定PS实例可以访问的内置功能.Runspace可以跨越网络边界.
  • Session是Powershell的特定实例.这些也可以跨越网络边界.
  • 应用程序域(或AppDomain)包含已加载的程序集.在许多情况下,一旦将数据加载到AppDomain中,就无法卸载它.必须处理AppDomain以支持新的AppDomain.如果通过其他应用程序调用PS脚本,则创建的PS实例将继承调用应用程序的AppDomain.

谁能更好地解释这些概念?是否有某种维恩图或其他能够充实这些信息的东西?在线文档并没有太大帮助.

PSG*_*Guy 6

考虑这些的最方便的方法是按照与列出它们的方式相反的顺序:

所有AppDomain实例均由 .NET 公共语言运行时 (CLR) 托管在 Windows 进程内。安AppDomain一个Windows 进程,它是一个安全边界。一般来说,一个应用程序域中的代码不允许直接跨越到另一个应用程序域。

Windows PowerShell 运行空间是实际创建 PowerShell 运行时的位置。它提供了一些核心基础设施,例如管道的创建。这是一个 .NET 对象,它继承父应用程序域。它确实具有远程处理功能,但它们与 .NET Framework 本质上提供的任何内容并不真正相关。相反,远程处理功能由 Windows PowerShell 产品基础结构提供。

单个运行空间可以是多个会话的主机。会话实例可能作为本地计算机上的纯本地构造存在,也可能存在于网络的其他位置。当针对远程会话发出命令时,命令本身会发送到远程托管提供商并执行,并将整个管道的结果返回到原始请求者。

有几个不同的范围,它们本质上是分层的。有顶级作用域、函数作用域、模块作用域、脚本作用域等。当作用域之间发生命名冲突时,最本地的作用域获胜。范围还使您能够隐藏数据,如果您正在构建模块,这是一个非常有用的功能。任何范围都可以通过名称和变量名称来访问。一个例子是$script:myVar