Invoke-Command в последовательности рабочих процессов - PullRequest
0 голосов
/ 02 марта 2020

Помогите, чтобы Invoke-Command работал. Он говорит, что параметр -ScriptBlock имеет значение null. Кажется, функция RegHomePage () недоступна в InlineScript {}.

function RegHomePage (){
get-item -path Registry::"HKEY_USERS\*\Software\Microsoft\Internet Explorer\Main" | `
Get-ItemProperty | Where-Object {$_."Start Page" -ne $null} | Set-ItemProperty -Name "Start Page" -Value "about:blank"
}

$creds = Get-Credential -Credential value\wadmin
workflow foreachtest
{
    param([Parameter(mandatory=$true)][string[]]$computers)

    foreach -parallel -throttlelimit 20 ($computer in $computers)
    {
        sequence
        {
            $isPing = Test-Connection -count 1 $computer -quiet
            if($isPing){                
                $isWSMan  = [bool](Test-WSMan $computer -ErrorAction SilentlyContinue)
            }
            if($isWSMan){
                InlineScript{
                    Invoke-Command -ComputerName $USING:computer -ScriptBlock ${function:RegHomePage}
                    } -PSComputerName $computer
                echo "$computer OK"
            }
            Else{
                $Workflow:out += "$computer`r`n"
                echo "$computer FAILED"
            }       

        }

    }
    Out-File .\offline.txt -InputObject $out
}

foreachtest -computers (Get-Content .\comps.txt)

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Кажется, есть несколько проблем с этим блоком inlineScript.

  • Не указывайте параметр PSComputerName, так как вы уже запускаете задание на каждом компьютере. Здесь нет необходимости ссылаться на другие системы.
  • Я бы предложил использовать Write-Output вместо echo (используйте встроенные команды powershell)
  • Переместите функцию внутри встроенного сценария, чтобы ввести ее в область действия каждой итерации.
workflow testing {
    foreach -parallel ($computer in $computers) {
        sequence {
            inlinescript {
                function RegHomePage {
                    Get-Item -path Registry::"HKEY_USERS\*\Software\Microsoft\Internet Explorer\Main" | `
                    Get-ItemProperty | Where-Object {$_."Start Page" -ne $null} | Set-ItemProperty -Name "Start Page" -Value "about:blank"
                }
                Invoke-Command -ComputerName $using:computer -ScriptBlock ${Function:RegHomePage}
            }
        }
    }
}

Вот что я тестировал.

workflow testingWF {
    Param ([string[]] $computers)

    foreach -parallel ($computer in $computers) {
        sequence {
            InlineScript {
                function testFunc {
                  Param($comp)
                  Write-Output "$($comp.split('.')[0]) == TestFunc"
                }

                Invoke-Command -ComputerName $Using:computer -ScriptBlock ${Function:testFunc} -ArgumentList $using:computer

            }
        }
    }
}

testingWF serverFQDN1,serverFQDN2

#Prints
server1 == TestFunc
server2 == TestFunc

Предложение о том, как переписать код выше

Вместо использования рабочий процесс для запуска параллельного foreach l oop, я бы рекомендовал заменить функциональность на -AsJob.

foreach($computer in $computers) {
    Invoke-Command -ComputerName $computer -ScriptBlock ${Function:RegHomePage} -AsJob
}

# Remove Jobs when done
Get-Job | Wait-Job | Remove-Job
1 голос
/ 02 марта 2020

InlineScript не поддерживает $ с помощью: function, попробуйте вложенный рабочий процесс вложенную работу Вы можете переместить свою функцию в блок InlineScript. Вы уверены, что ключ -PSComputerName должен иметь значение $Computers вместо $computer

Добавление

Только один способ вызова функции в inlinescriptblock, это поставить его внутри. Но, возможно, вы можете использовать вложенный рабочий процесс, чтобы несколько раз вызвать функцию вызова команды. Вложенный пример:

workflow Test-Workflow { 
function mess{"get ready"} 
   workflow nest-test{  
   mess 
   } 
nest-test 
} 
Test-Workflow

Вы также можете прочитать, почему вы не можете использовать импорт для встроенного скрипта в этом уроке: урок

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