PowerShell ScriptBlock 到底是什么

2023-11-24

PowerShell ScriptBlock 不是词汇闭合因为它不会关闭其声明环境中引用的变量。相反,它似乎利用了动态作用域和自由变量,这些变量在运行时绑定在 lambda 表达式中。

function Get-Block {
  $b = "PowerShell"
  $value = {"Hello $b"}
  return $value
}
$block = Get-Block
& $block
# Hello
# PowerShell is not written as it is not defined in the scope
# in which the block was executed.


function foo {
  $value = 5
  function bar {
    return $value
  }
  return bar
}
foo
# 5
# 5 is written $value existed during the evaluation of the bar function
# it is my understanding that a function is a named scriptblock
#  which is also registered to function:

对 ScriptBlock 调用 GetNewClosure() 会返回一个新的 ScriptBlock,该 ScriptBlock 会关闭所引用的变量。但这在范围和能力上都非常有限。

ScriptBlock 的分类是什么?


Per the docs,脚本块是“脚本文本的预编译块”。所以默认情况下你只是一个预先解析的脚本块,不多也不少。执行它会创建一个子作用域,但除此之外,就好像您内联粘贴了代码一样。因此,最合适的术语就是“只读源代码”。

Calling GetNewClosure固定在动态生成的模块上,该模块基本上携带调用时调用者范围内所有变量的快照GetNewClosure。它不是真正的闭包,只是变量的快照副本。脚本块本身仍然只是源代码,并且在调用它之前不会发生变量绑定。您可以根据需要在附加模块中添加/删除/编辑变量。

function GetSB
{
   $funcVar = 'initial copy'

   {"FuncVar is $funcVar"}.GetNewClosure()

   $funcVar = 'updated value'  # no effect, snapshot is taken when GetNewClosure is called
}

$sb = GetSB

& $sb  # FuncVar is initial copy

$funcVar = 'outside'
& $sb  # FuncVar is initial copy

$sb.Module.SessionState.PSVariable.Remove('funcVar')
& $sb  # FuncVar is outside
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell ScriptBlock 到底是什么 的相关文章

随机推荐

  • 在模板类中声明一个结构体,未定义成员函数

    我目前正在尝试使用列表类私有的节点结构在列表模板类中实现排序算法 我正在使用一些私有递归函数 它们返回一个指向节点类型的指针 这会导致 g 给我一个声明错误 这是我所拥有的样本 template
  • 组的 Firebase 存储安全规则

    我知道对此有几个问题 例如https stackoverflow com a 52808572 3481904 但对于我的情况我仍然没有好的解决方案 我的应用程序有Groups 动态创建 删除 并且可以随时添加 删除成员 用户 Each 群
  • Python 目录遍历器

    我目前正在使用目录遍历器Here import os class DirectoryWalker a forward iterator that traverses a directory tree def init self direct
  • 使用 grep 计算多个文件中某个字符串的所有出现次数

    我有一堆日志文件 我需要找出某个字符串在所有文件中出现了多少次 grep c string returns file1 1 file2 0 file3 0 使用管道 我只能获取出现一次或多次的文件 grep c string grep v
  • SIGINT 与其他终止信号(例如 SIGTERM、SIGQUIT 和 SIGKILL)有何关系?

    在 POSIX 系统上 终止信号通常具有以下顺序 根据许多手册页和 POSIX 规范 SIGTERM 礼貌地要求进程终止 它应该优雅地终止 清理所有资源 文件 套接字 子进程等 删除临时文件等 SIGQUIT 更强烈的要求 它将终止不正常的
  • 将 Azure 服务总线与 Android 连接

    我编写了一个简单的 java 程序 jdk 1 7 它列出了所有服务总线主题并将每个主题的名称打印到标准输出 try String namespace myservicebus from azure portal String issuer
  • 用于 cookie 的编码方案

    RFC 6265 第 6 1 节指定每个 cookie 至少允许 4096 字节 现在为了知道有多少人物允许每个 cookie 我需要知道用于 cookie 的字符编码 因为 RFC 指定了每个 cookie 的最大大小bytes并不是人物
  • 在视图中访问会话变量

    由于我无法访问视图中的会话变量 我想知道是否需要向视图添加更多内容才能使其正常工作 在我看来 Session ComputerNumber ToString 控制器 Session ComputerNumber game RandomNum
  • 使用 PDO 获取单行、单列

    我有一个 mysql 查询 其目标是单行中的单列 SELECT some col name FROM table name WHERE user user 当我执行该语句后 stmt gt execute 如何将这个单个单元格直接放入没有循
  • C语言中如何确定文件的大小?

    如何计算文件的大小 以字节为单位 include
  • 类型错误:无法读取未定义的属性“getState”

    我想尝试小型 redux 示例 因此我安装了 redux 但出现此错误 类型错误 无法读取未定义的属性 getState 新的提供者 webpack internal node modules react redux es componen
  • 如何在 Silverlight 应用程序中调试 IIS 托管的 Web 服务

    有人知道如何在 Silverlight 4 0 应用程序中调试由 IIS 托管的 Web 服务吗 我的IIS版本是7 5 操作系统是windows 7 您能具体说明如何操作的步骤吗 太感谢了 运行解决方案时 在调试模式下 或具有最新的符号文
  • 如何将UIView转换为没有背景的UIImage?

    我有包含图钉图像和标签的 UIView 因为我们知道 UIView 是矩形 所以如果我将 UIView 转换为 UIImage UIImage 也是矩形 我想让 UIImage 像图钉图像一样 因为如果用户单击背景 UIImage 的事件将
  • C# 圣诞树

    我是 C 新手 因此我请求帮助我实现此目的 我刚刚有这个代码 class Program static void Main string args AnotherTriangle ob new AnotherTriangle ob Crea
  • 寻找图像中的空白区域

    这个问题在某种程度上与语言无关 但我选择的工具恰好是 numpy 数组 我正在做的是通过 PIL 获取两个图像的差异 img ImageChops difference img1 img2 我想找到包含从一张图片到另一张图片的变化的矩形区域
  • 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据,HKMetadataKeyTimeZone 始终为零

    我正在使用 HealthKit 读取用户的健康数据 尝试从健康数据中获取时区信息 以确定健康活动发生在哪个确切时区 为此 我依赖 HealthKit 元数据中的 HKMetadataKeyTimeZone 键 但即使对于苹果健康应用程序自动
  • 如何通过 at() 函数访问二维向量的索引?

    我将在成员函数中初始化一个 2D 向量 其中输入参数计划被输入到函数参数内的确定索引中 此外 出于安全考虑 我不会使用 运算符来进行成员访问 如何使用 at 函数来访问 2D 向量的索引 如下所示 vector
  • 如何正确显示孟加拉语文本

    我有一个JTextArea我需要在其中显示孟加拉语文本 例如 但我只能看到长方形的盒子 如何正确显示孟加拉语字符 首先采用孟加拉 unicode 支持的字体 例如 Font banglaFont new Font Arial Unicode
  • os.sched_getaffinity(0) 与 os.cpu_count()

    所以 我知道标题中两种方法的区别 但不知道实际含义 据我了解 如果您使用的 NUM WORKERS 数量多于实际可用的核心数量 您将面临性能大幅下降 因为您的操作系统不断地来回切换 试图保持并行 不知道这有多真实 但我在某处从比我聪明的人那
  • PowerShell ScriptBlock 到底是什么

    PowerShell ScriptBlock 不是词汇闭合因为它不会关闭其声明环境中引用的变量 相反 它似乎利用了动态作用域和自由变量 这些变量在运行时绑定在 lambda 表达式中 function Get Block b PowerSh