- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个脚本,我想使用 PowerShell 的 CmdletBinding() 。有没有办法在脚本中定义函数?当我尝试时,PowerShell 提示“表达式或语句中出现意外的 token 'function'”
这是我正在尝试做的事情的简化示例。
[CmdletBinding()]
param(
[String]
$Value
)
BEGIN {
f("Begin")
}
PROCESS {
f("Process:" + $Value)
}
END {
f("End")
}
Function f() {
param([String]$m)
Write-Host $m
}
就我而言,编写模块是浪费开销。这些功能只需对这一脚本可用。我不想弄乱模块路径或脚本位置。我只想运行一个其中定义了函数的脚本。
最佳答案
当您的代码应该处理管道输入时,您可以使用 begin
、process
和 end
block 。 begin
block 用于预处理,并在输入处理开始之前运行一次。 end
block 用于后处理,并在输入处理完成后运行一次。如果您想在 end
block 之外的任何地方调用函数,您可以在 begin
block 中定义它(在 process
block 会浪费资源,即使您没有在 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
:
<小时/>Piping Objects to Functions
Any function can take input from the pipeline. You can control how a function processes input from the pipeline using Begin, Process, and End keywords. The following sample syntax shows the three keywords:
function <name> {
begin {<statement list>}
process {<statement list>}
end {<statement list>}
}The Begin statement list runs one time only, at the beginning of the function.
The Process statement list runs one time for each object in the pipeline. While the Process block is running, each pipeline object is assigned to the $_ automatic variable, one pipeline object at a time.
After the function receives all the objects in the pipeline, the End statement list runs one time. If no Begin, Process, or End keywords are used, all the statements are treated like an End statement list.
如果您的代码不处理管道输入,您可以完全删除 begin
、process
和 end
block ,并将所有内容放入脚本中正文:
[CmdletBinding()]
param(
[String]$Value
)
Function f() {
param([String]$m)
Write-Host $m
}
f("Begin")
f("Process:" + $Value)
f("End")
<小时/>
编辑:如果您想将 f
的定义放在脚本末尾,您需要将代码的其余部分定义为worker/main/whatever函数并在脚本末尾调用该函数,例如:
[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
关于function - 如何在 CmdletBinding() 脚本中定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30737491/
该参数似乎根本没有被“设置”为参数。验证集不起作用。自动完成也不行。键入参数名称也不起作用。 我知道我以前做过动态参数。但这一次,我错过了一些东西。只是不知道它是什么。 Function Add-Co
根据get-help about_Functions_CmdletBindingAttribute The CmdletBinding attribute is an attribute of fun
我正在编写一个脚本,我想使用 PowerShell 的 CmdletBinding() 。有没有办法在脚本中定义函数?当我尝试时,PowerShell 提示“表达式或语句中出现意外的 token 'f
考虑 PowerShell 代码示例 here : 它在 .ps1 scipt 文件之上有 [CmdletBinding()]。 请注意 [CmdletBinding()] 在文件之上,而不是函数之上
(Powershell 5) 我有以下合并功能: (更新:删除了 process block 中的“优化”continue 调用。) function Find-Defined { begin
我是一名优秀的程序员,十分优秀!