Кажется, есть несколько проблем с этим блоком 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