Как предоставить опции для блоков скриптов? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь узнать о блоках скрипта на 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 ]

1 голос
/ 10 июля 2019

Помните, что вы всегда можете проверить документацию: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-6

$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/about/about_functions?view=powershell-6)

1 голос
/ 11 июля 2019

Вы можете использовать оператор вызова и в скрипт-блоках, и просто предоставить аргументы после пробела или -option:

& $block abc

The option was abc
ABC was specified

И позже вы можете назначить скрипт-блок функции. Вот что такое функция .

$function:myfunc = $block
1 голос
/ 10 июля 2019

В случае сомнений прочитайте документацию :

-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, а не ==.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...