вызов пользовательской функции внутри скриптового блока в Powershell [duplicate]

У меня есть другая перспектива ответить на это.

При работе на разных уровнях, например, в приложении MVC, контроллеру нужны службы для вызова бизнес-операций. В таких сценариях контейнер инжекции зависимостей может использоваться для инициализации служб, чтобы исключить исключение NullReferenceException. Это означает, что вам не нужно беспокоиться о проверке нулевого значения и просто вызвать службы с контроллера, как будто они всегда будут доступны (и инициализированы) как одиночный или прототип.

public class MyController
{
    private ServiceA serviceA;
    private ServiceB serviceB;

    public MyController(ServiceA serviceA, ServiceB serviceB)
    {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
    }

    public void MyMethod()
    {
        // We don't need to check null because the dependency injection container 
        // injects it, provided you took care of bootstrapping it.
        var someObject = serviceA.DoThis();
    }
}
12
задан Alex58 23 August 2011 в 14:53
поделиться

4 ответа

Как указывает @Shay, FOO необходимо определить для задания. Другой способ сделать это - использовать параметр -InitializationScript для подготовки сеанса.

Для вашего примера:

$functions = {
    function FOO { write-host "HEY" }
}

Start-Job -InitializationScript $functions -ScriptBlock {FOO}|
    Wait-Job| Receive-Job

Это может быть полезно, если вы хотите использовать одни и те же функции для разных заданий.

16
ответ дан Rynant 28 August 2018 в 09:22
поделиться

Улучшение ответа @ Rynant:

Вы можете определить функцию как обычно в основной части вашего скрипта:

Function FOO 
{ 
  Write-Host "HEY" 
} 

, а затем переработать это определение в скриптблоке :

$export_functions = [scriptblock]::Create(@"
  Function Foo { $function:FOO }
"@)

(имеет смысл, если у вас есть существенное тело функции), а затем передайте их на Start-Job, как указано выше:

Start-Job -ScriptBlock {FOO} -InitializationScript $export_functions| Wait-Job | Receive-Job

Мне нравится этот путь, так как легче отлаживать задания, запуская их локально под отладчиком.

1
ответ дан Bob Mortimer 28 August 2018 в 09:22
поделиться

@ Предложение Rynant InitializationScript велико

Я думал, что цель блоков (скриптов) состоит в том, чтобы вы могли их передавать. Так что, в зависимости от того, как вы это делаете, я бы сказал: «

$FOO = {write-host "HEY"}

Start-Job -ScriptBlock $FOO | wait-job |Receive-Job

Конечно, вы можете также параметризовать блоки скриптов:

$foo = {param($bar) write-host $bar}

Start-Job -ScriptBlock $foo -ArgumentList "HEY" | wait-job | receive-job
7
ответ дан manojlds 28 August 2018 в 09:22
поделиться

Функция должна находиться внутри скриптового блока:

Start-Job -ScriptBlock { function FOO { write-host "HEY" } ; FOO } | Wait-Job | Receive-Job
2
ответ дан Shay Levy 28 August 2018 в 09:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: