This is an overkill for your question, but you might be interested in the general alternate approach to do something in parallel on the several servers:
$servers=@('server1', 'server2', 'server3') $recycleAppPools = { echo $(Get-Wmiobject -Class Win32_ComputerSystem).Name appcmd list apppools /state:Started /xml | appcmd recycle apppools /in echo "`n" } workflow Perform-Deployment { Param ($servers, $actionBlock) # Run on all servers in parallel foreach -parallel ($server in $servers) { "Doing on $server..." # Execute script on the server InlineScript { $scriptBlock = [scriptblock]::Create($Using:actionBlock) Invoke-Command -computername $Using:server -ScriptBlock $scriptBlock } } } cls # Execute workflow Perform-Deployment $servers $recycleAppPools
Moreover, you could pass parameters to your script block, like, for example:
$DeployPythonPackage = { param($venv, $pythonPackagePath) & "$venv\scripts\pip" install --upgrade $pythonPackagePath } workflow Perform-Deployment { Param ($servers, $actionBlock, $venv, $pythonPackagePath) # Run on all servers in parallel foreach -parallel ($server in $servers) { "Deploying Python package '$pythonPackagePath' on $server..." # Execute script on the server InlineScript { $scriptBlock = [scriptblock]::Create($Using:actionBlock) Invoke-Command -computername $Using:server -ScriptBlock $scriptBlock ` -ArgumentList $Using:venv, $Using:pythonPackagePath } } } cls # Execute workflow Perform-Deployment $servers $DeployPythonPackage $venv $pythonPackagePath
appcmdinvoked bypsexecon remote computer, but secondappcmdinvoked on local computer. Is that what you want?