Export/Private/Submit-ScriptToVMAndExecute.ps1
function Global:Submit-ScriptToVmAndExecute { [CmdletBinding()] <# .SYNOPSIS ... .DESCRIPTION ... Do not pass any secure-objects in $RunParameter (like SecureString for Passwords); these will cause to run indefinitely #> param( [Parameter(Mandatory = $true)] [string] $ResourceGroupName, [Parameter(Mandatory = $true)] [string] $ResourceLocation, [Parameter(Mandatory = $true)] [string] $VMName, [Parameter(Mandatory = $true)] $ScriptBlock, [Parameter(Mandatory = $false)] $RunParameter, [Parameter(Mandatory = $false)] [string] $MsgBeforeExecuting, [Parameter(Mandatory = $false)] [switch] $ScaleSetExecution = $false ) process { if ($MsgBeforeExecuting) { Write-Verbose $MsgBeforeExecuting } # Temporary save script-block as file $fullscriptpath = New-TemporaryFile | Rename-Item -NewName { $_ -replace 'tmp$', 'ps1' } -PassThru | Select-Object -ExpandProperty FullName Set-Content -Path $fullscriptpath -Value $ScriptBlock Write-Verbose "Running command on $VMName..." if (-not($ScaleSetExecution)) { Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroupName -VMName $VMName -CommandId 'RunPowerShellScript' -ScriptPath $fullscriptpath -Parameter $RunParameter | Out-Null } else { foreach ($instance in Get-AzVmssVM -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMName) { $instanceId = $instance.InstanceId Write-Verbose "on Instance $instanceId..." Invoke-AzVmssVMRunCommand -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMName -InstanceId $instanceId -CommandId 'RunPowerShellScript' -ScriptPath $fullscriptpath -Parameter $RunParameter | Out-Null } } Write-Verbose "Command completed." Remove-Item $fullscriptpath -Force } } |