Powershell 脚本级别上DynamicParam块之后的任何代码都被解析为语法错误

Powershell 脚本级别上DynamicParam块之后的任何代码都被解析为语法错误,powershell,Powershell,我试图在脚本级别使用DynamicParam。互联网上的所有示例都显示了功能级别。只要在DynamicParam{}之后没有代码,它就可以工作(我可以在调试器的块内停止),但是在调试器之后添加的任何代码都是语法错误。我看到一些建议,应该使用begin/process/end,我试过了,但没有任何效果 我有这个概念证明: MyScript.ps1 [CmdletBinding()] Param( [parameter()] [string] $a, [parameter()] [stri

我试图在脚本级别使用DynamicParam。互联网上的所有示例都显示了功能级别。只要在DynamicParam{}之后没有代码,它就可以工作(我可以在调试器的块内停止),但是在调试器之后添加的任何代码都是语法错误。我看到一些建议,应该使用begin/process/end,我试过了,但没有任何效果

我有这个概念证明:

MyScript.ps1

[CmdletBinding()]
Param(
 [parameter()]
 [string] $a,

 [parameter()]
 [string] $b,

 [parameter()]
 [string] $c
)
DynamicParam
{
  if($a -match 'aaa') 
  {
     # .......
     # creates dynamic param here
     # .......
  }
}

# Anything below this line is not accepted by powershell parser
# Next line will cause powershell to generate: "Unexpected token '$x' in expression or statement" error.
$x = 10 
如果我加上:

begin {}
process {}
end {}
之后我仍然无法添加任何代码

也许是我看不见的愚蠢的错误;我被卡住了

Powershell版本:

$PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- ---------
4      0    -1    -1

如果使用了
dynamicRAM
块,PowerShell希望您的代码至少位于
进程
开始
结束
块中的一个块内。因此,您的脚本可能如下所示:

[CmdletBinding()]
Param(
 [parameter()]
 [string] $a,

 [parameter()]
 [string] $b,

 [parameter()]
 [string] $c
)
DynamicParam
{
  if($a -match 'aaa') 
  {
     # .......
     # creates dynamic param here
     # .......
  }
}

Process 
{
# Anything below this line is not accepted by powershell parser
$x = 10 # This will cause powershell to generate: "Unexpected token '$x' in expression or statement"
}

无法复制,但是应该注意,如果声明DynamicRAM,则必须声明begin、process和end中的一个。您的代码必须位于其中一个块内。你们不能把代码放在结尾下面(例如)。谢谢你们,克里斯。是的,我没有意识到脚本的其余部分应该在进程块中。拥有流程{}是否意味着一些额外的需求/影响?我的理解是,它用于支持管道。默认情况下,您将在结束块中执行param后放置代码。如果你愿意,这是一种不公开的帮助方式。将代码推入流程允许您支持管道,但这绝不是强制性的。理论上,如果不打算支持管道,就不应该将代码放入过程中。如果有人向它提供管道,它将为每个输入对象执行一次块,而不管您是否使用该输入对象。e、 g.
功能测试{process{'bob'};获取ChildItem | test
感谢您的解释。因此,如果我不打算支持管道,我可以将代码放在{}端。是的,这会很好。最后一个警告是,如果您在后面标记一个参数作为接受管道输入,这样的参数中的值将只适用于进程块,而不是开始或结束。Hi@ M.K.,如果这个或任何答案已经解决了您的问题,请通过单击复选标记来考虑。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。