Могу ли я создать массив функций в Powershell? - PullRequest
0 голосов
/ 07 ноября 2018

Я хотел бы иметь массив, содержащий набор функций, которые я могу перебирать и вызывать. Проблема заключается в том, что все функции выполняются через строку, которая добавляет их в массив (т. Е. $ Scripts).

Пример:

function Hello
{
    $BadFunction = "Hello"
    Write-Host "Hello!"
}

function HowAreYou
{
    $BadFunction = "HowAreYou"
    Write-Host "How are you?"
    #$false = $true
}

function Goodbye
{
    $BadFunction = "Goodbye"
    Write-Host "Goodbye!"
}

$scripts = @((Hello), (HowAreYou), (Goodbye))

foreach ($script in $scripts)
{
    $script
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

ответ Джоуи содержит хорошую информацию, но если все, что вам нужно, это сослаться на ваши функции с помощью name , , определите ваш массив как содержащий имена функций как строки и вызывать функции по этим строкам с помощью &, оператора вызова :

function Hello {  "Hello!" }

function HowAreYou { "How are you?" }

function Goodbye { "Goodbye!" }

# The array of function names *as strings*.
# Note that you don't need @(...) to create an array.
$funcs = 'Hello', 'HowAreYou', 'Goodbye'

foreach ($func in $funcs)
{
  # Use & to call the function by the name stored in a variable.
  & $func
}

Проблема заключается в том, что все функции выполняются через строку, которая добавляет их в массив (т. Е. $ Scripts).

Это потому, что ваши элементы массива представляют собой выражения (из-за включающего (...)), которые вызывают функции (например, (Hello) вызывает Hello и выводит элемент массива), учитывая, что на них ссылаются без одинарных или двойных кавычек .

В отличие, скажем, от bash, вы не можете определить string элементы массива как barewords (токены без заключения в одинарные или двойные кавычки); Например, ниже приведена синтаксическая ошибка в PowerShell:

# !! Does NOT work - strings must be quoted.
$funcs = Hello, HowAreYou, GoodBye # ditto with @(...)
0 голосов
/ 07 ноября 2018

Функции можно вызывать только по их имени, без ссылки, но вы можете получить блок скриптов через диск Function::

$scripts = $Function:Hello, $Function:HowAreYou, $Function:GoodBye

# call them with the & operator
$scripts | ForEach-Object { & $_ }

# You can also call them by calling Invoke on the scriptblock
$scripts | ForEach-Object Invoke
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...