Проблема с функцией рабочего процесса Powershell

Я пытаюсь повторно использовать код в своих модулях Runbook SMA, но все, что я пытаюсь поместить в функцию, работает не так, как ожидалось. Например, если я это сделаю, он сработает и вернет имя пользователя учетных данных:

workflow RB_Test
{   
    $credent = Get-AutomationPSCredential -Name "CRED_TESTE"
    $var = $credent.Username
    "result = ${var}"       
}

Выход:

введите здесь описание изображения

Но если я перехожу к этому, он больше не работает (возвращает ноль):

workflow RB_Test
{   
    function FN_Test 
    { 
       $credent = Get-AutomationPSCredential -Name "CRED_TESTE"
       $var = $credent.Username
       "result = ${var}"        
    }
    FN_Test
}   

Вывод: введите здесь описание изображения

Я пробовал разные вещи, но безуспешно. Экран отладки/подробности не возвращает ничего другого. Это тоже не работает:

Inlinescript { 
 . FN_Test
}   

Моя цель состояла бы в том, чтобы поместить несколько функций в отдельный модуль, а затем импортировать его в мои модули Runbook для повторного использования, но это действительно не работает. Это модуль Runbook (рабочий процесс PowerShell), созданный в Service Management Automation (SMA).

Я читал, что в рабочем процессе Powershell есть некоторые ограничения по сравнению с чистым Powershell, но я не уверен, что я нахожу одно из них: https://blogs.technet.microsoft.com/heyscriptingguy/2013/02/01/powershell-workflows-restrictions/

Спасибо


person Felipe Moreno    schedule 25.05.2016    source источник


Ответы (1)


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

workflow FunctionTest {
    function log {
        param(
            [string]$Message
        )

        Write-Output $Message
        Write-Output "Filename: $Filename"
        Write-Output "using:Filename: $using:Filename"
        Write-Output "workflow:Filename: $workflow:Filename"
        Write-Output "----"
        ## Under what conditions is 'global' used?  Can't be used in a workflow...Hey Scripting Guy!
    }

    workflow DoSomething {
        param(
            [string]$Filename
        )

        log "Starting DoSomething"
    }

    $Filename = "LogFile_2017.csv"

    log "Starting workflow"

    ## Variables need to be passed into workflow from parent-workflow
    DoSomething -Filename $Filename

    log "End workflow"
}

FunctionTest

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

К области видимости переменных нужно привыкнуть.

person Malcont3nt    schedule 21.02.2017