如何在 CmdletBinding() 脚本中定义函数?

2024-04-01

我正在编写一个脚本,我想使用 PowerShell 的 CmdletBinding() 。 有没有办法在脚本中定义函数?当我尝试时,PowerShell 抱怨“表达式或语句中出现意外的 token '函数'”

这是我正在尝试做的事情的一个简化示例。

[CmdletBinding()]
param(
    [String]
    $Value
)

BEGIN {
    f("Begin")
}

PROCESS {
    f("Process:" + $Value)
}

END {
    f("End")
}

Function f() {
    param([String]$m)
    Write-Host $m
}

就我而言,编写模块是浪费开销。这些功能只需对这一脚本可用。我不想弄乱模块路径或脚本位置。我只想运行一个其中定义了函数的脚本。


You use begin, process, and end当您的代码应该处理管道输入时会阻塞。这begin块用于预处理,并在输入处理开始之前运行一次。这end块用于后处理,并在输入处理完成后运行一次。如果您想在除end块你定义它在begin块(在中一遍又一遍地重新定义它process块会浪费资源,即使你没有在begin block).

[CmdletBinding()]
param(
    [String]$Value
)

BEGIN {
    Function f() {
        param([String]$m)
        Write-Host $m
    }

    f("Begin")
}

PROCESS {
    f("Process:" + $Value)
}

END {
    f("End")
}

引用自about_Functions https://technet.microsoft.com/en-us/library/hh847829.aspx:

将对象通过管道传递给函数

任何函数都可以从管道获取输入。您可以使用 Begin、Process 和 End 关键字控制函数如何处理来自管道的输入。以下示例语法显示了三个关键字:

function <name> { 
    begin {<statement list>}
    process {<statement list>}
    end {<statement list>}
}

Begin 语句列表仅在函数开始时运行一次。

Process 语句列表为管道中的每个对象运行一次。当 Process 块运行时,每个管道对象都会分配给 $_ 自动变量,一次分配一个管道对象。

函数接收到管道中的所有对象后,End 语句列表会运行一次。如果未使用 Begin、Process 或 End 关键字,则所有语句都将被视为 End 语句列表。


如果您的代码不处理管道输入,您可以删除begin, process, and end完全阻塞并将所有内容放入脚本主体中:

[CmdletBinding()]
param(
    [String]$Value
)

Function f() {
    param([String]$m)
    Write-Host $m
}

f("Begin")
f("Process:" + $Value)
f("End")

Edit:如果你想把定义f在脚本末尾,您需要将其余代码定义为工作程序/主函数/其他函数,并在脚本末尾调用该函数,例如:

[CmdletBinding()]
param(
    [String]$Value
)

function Main {
    [CmdletBinding()]
    param(
        [String]$Param
    )

    BEGIN   { f("Begin") }
    PROCESS { f("Process:" + $Param) }
    END     { f("End") }
}

Function f() {
    param([String]$m)
    Write-Host $m
}

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

如何在 CmdletBinding() 脚本中定义函数? 的相关文章

随机推荐

  • 将 C# 单元测试名称转换为英文(testdox 样式)

    我有一大堆用 MbUnit 编写的单元测试 我想从测试名称生成简单的英语句子 这里介绍一下这个概念 http dannorth net introducing bdd http dannorth net introducing bdd 这是
  • 基于类的vue组件的标签名称是什么

    参考下面的链接 我们可以使用用 TypeScript 编写的基于类的 vue 组件 使用这些自定义组件的正确方法是什么 例如 下面的 Es5 代码定义了一个可以在其他组件模板中使用的组件 例如
  • 带分组的 WPF DataGrid 虚拟化

    我正在使用来自 CodePlex 的 WPF DataGrid http wpf codeplex com 我需要让虚拟化与分组一起使用 This question https stackoverflow com questions 110
  • 获取页面事件、选项卡关闭、失去焦点?

    问题是如何在特定选项卡上查询此类事件 用户已加载具有特定 URL 的选项卡 例如 google com 我认为最简单的方法是使用 chrome tabs query 然后您可以获取带有 url 的活动选项卡 用户已关闭选项卡 该选项卡处于非
  • 是否有任何选项可以禁用开火服务器上的群聊消息历史记录?

    我一直在创造group chat application 在实现群聊功能时我面临问题 当我每次join the room open fire sends last two days messages 这是我每次加入房间时收到的帖子消息
  • 在页面加载时显示 AJAX 加载器

    你好 我对 javascript 很陌生 不知道如何使用它 我希望 AJAX 加载器在页面加载时出现 加载完成后我希望加载器消失 谁能给我发一个代码吗 通常 这是通过在内容顶部显示 隐藏一两个 div 来完成的 您可以从以下位置获取精美的加
  • Sharepoint 2013。使用 JavaScript 的多值查找字段

    有没有办法使用 JavaScript 客户端对象模型编辑多值查找字段 我需要删除一个或多个查找值 并最终添加一个或多个值 我到处搜索 我阅读MSDN文档 我也看看我的桌子底下 Thanks Multiple Column Lookup值表示
  • Flutter:在启​​动时执行函数 - 等待 HTTP 响应解析器提取图像 URL

    我正在开发一个 Flutter 应用程序 我需要从 API 获取几乎所有内容 包括图像 颜色 文本等 所以我应该做的是构建应用程序的主要结构 然后用 API 提供的信息填充所有内容 当应用程序开始获取响应并初始化变量以在应用程序中使用它们时
  • C# 和 C++ 类继承混合

    我有一堆有趣的程序集想要组合在一起 通用汇编 C 或 C CLI public class MyBase public void MethodA private void MethodB protected virtual MethodC
  • 使用 LINQ 从文件中读取文本数据

    我有以下文本文件 37 44 60 67 15 94 45 02 44 如何使用 LINQ 从此文件中读取所有数字并将它们保存到二维数组中 我所做的就是创建一个简单的数组 其中每行中包含所有第一个值 在这种情况下使用 LINQ 是个好主意还
  • 如何在 c 中的变量中仅存储文件的结束位

    我的代码如下 include
  • Google API key V2 RuntimeException [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我创建了一个示例 Android 应用程序 用于使用 google api key v2 访问 google 地图 当我
  • 在 Haskell 中如何将字符串列表相乘? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试编写一个函数 该函数接受字符串列表和 Int 并返回其中每个字符串都是 int 次的字符串列表 那是 duplicate S
  • Pandas - 根据行值生成唯一 ID

    我想为用户生成一个基于整数的唯一 ID 在我的 df 中 假设我有 index first last dob 0 peter jones 20000101 1 john doe 19870105 2 adam smith 19441212
  • 带 Java 客户端的键值数据库

    我基本上想在磁盘上存储一个哈希表 以便以后可以查询它 我的程序是用Java 编写的 哈希表从字符串映射到列表 那里有很多键值存储 但经过大量研究 阅读后 尚不清楚哪一个最适合我的目的 以下是一些对我来说很重要的事情 简单的键值存储 允许您使
  • 将带有各种分隔符的地址拆分为街道地址、城市、州、邮政编码和国家/地区

    我的数据在 Excel 中 我有几张数据 其中地址始终位于每张数据的同一列中 地址格式的示例包括 1155 15th Street NW Suite 600 华盛顿特区 20005 美国4600 Empire Blvd 200 达勒姆 NC
  • 如何存储单个浏览器选项卡/窗口的状态?

    我正在开发一个单页 jQuery 和 Backbone js Web 应用程序 后端是 JBoss 6 应用程序服务器 到目前为止 我们的结构如下 只有一个servlet 前端控制器 来自 JavaScript 客户端的每个请求都会经过这里
  • 在 Emacs 中如何重新映射键?

    我正在寻找一种方法 可以在 emacs 窗口中切换控制键和大写锁定键 但是当我转到任何其他程序 例如 Firefox 时 我希望能够在新窗口中使用普通控制按钮 选项卡等 附加信息 我正在使用 Ubuntu 但所有系统的答案都很好 因为其他人
  • iOS:保存双重选择器的设置(数据持久性)

    所以我有一个双重选择器 用户可以将每个轮子设置为他们想要的 然后按下一个按钮来显示他们的选择 简单干净 但我想存储这些数据以供以后使用 以便在关闭应用程序并再次重新打开它后它不会消失 现在 我知道如何使用 datePicker 来做到这一点
  • 如何在 CmdletBinding() 脚本中定义函数?

    我正在编写一个脚本 我想使用 PowerShell 的 CmdletBinding 有没有办法在脚本中定义函数 当我尝试时 PowerShell 抱怨 表达式或语句中出现意外的 token 函数 这是我正在尝试做的事情的一个简化示例 Cmd