如何提供脚本块选项?

时间:2019-07-10 12:47:27

标签: powershell

我正在尝试在https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_script_blocks?view=powershell-6上了解脚本块。

我想通过事件注册命令的命令行选项将脚本块发送到事件注册,如下所示:

$Block = {
Param($option)
Write-Host "The option was $option"
if ($option==ABC) {
    Write-Host "ABC was specified"
}
}

但是当我通过附加进行测试

Invoke-Command -ScriptBlock $Block -option ABC

我得到了错误

  

Invoke-Command:找不到与参数名称“ option”匹配的参数。

3 个答案:

答案 0 :(得分:1)

如有疑问,请阅读documentation

  

-ArgumentList

     

在命令中提供局部变量的值。在远程计算机上运行命令之前,命令中的变量将被这些值替换。在以逗号分隔的列表中输入值。值按列出的顺序与变量关联。 ArgumentList的别名为“ Args”。

     

ArgumentList中的值可以是实际值,例如“ 1024”,也可以是对局部变量的引用,例如“ $ max”。

     

要在命令中使用局部变量,请使用以下命令格式:

{param($<name1>[, $<name2>]...) <command-with-local-variables>} -ArgumentList <value> -or- <local-variable>
     

“ param”关键字列出了命令中使用的局部变量。 ArgumentList参数按列出的顺序提供变量的值。

-ArgumentList数组中的第一个元素成为脚本块中第一个命名参数的值,第二个数组元素成为第二个命名参数的值,依此类推。

基本上,您的声明应如下所示:

Invoke-Command -ScriptBlock $Block -ArgumentList 'ABC'

此外,脚本块中比较操作的语法错误。 PowerShell中的相等比较运算符为-eq,而不是==

答案 1 :(得分:1)

请记住,您可以随时查看文档:{​​{3}}

$Block = {Param($option)
Write-Host "The option was $option"
if ($option -eq "ABC") // -eq instead of ==, string in quotations
   {Write-Host "ABC was specified"}
}

Invoke-Command -ScriptBlock $Block -ArgumentList "ABC"

如果有更多参数,则可以按顺序列出它们。使用脚本块并不是您经常要做的事情。最好创建一个函数(https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-6

答案 2 :(得分:1)

您也可以在脚本块上使用call运算符,只需在空格或-option之后提供参数即可。

& $block abc

The option was abc
ABC was specified

然后您可以稍后将脚本块分配给功能。这就是函数 的意思。

$function:myfunc = $block