Public/Invoke-Command.ps1

Register-ArgumentCompleter -CommandName Get-DockerCommand -ParameterName Name -ScriptBlock $ContainerNameCompleter

function Invoke-Command {

    <#

    .SYNOPSIS
    Invoke command

    .DESCRIPTION
    Invokes a command on a docker container.
    Wraps the docker `command exec`.

    .LINK
    https://docs.docker.com/engine/reference/commandline/exec/

    .PARAMETER Name
    Specifies the name of the docker container to run the command on.

    .PARAMETER Command
    Specifies the command to run on the docker container.

    .PARAMETER ArgumentList
    Specifies the list of arguments of the command.

    .PARAMETER Timeout
    Specifies the number of seconds to wait for the command to finish.

    .PARAMETER StringOutput
    Specifies if the output of the container command should be returned as string.

    .OUTPUTS
    System.string: Returns a string if the parameter StringOutput is set.

    .EXAMPLE
    PS C:\> $container = New-DockerContainer -Image 'microsoft/iis' -Detach
    PS C:\> Invoke-DockerCommand -Name $container.Name -Command 'hostname' -StringOutput
    88eb8fa9c07f

    #>


    [CmdletBinding()]
    param (
        [Parameter( Mandatory = $true )]
        [ValidateNotNullOrEmpty()]
        [string] $Name,

        [Parameter( Mandatory = $true )]
        [ValidateNotNullOrEmpty()]
        [string] $Command,

        [Parameter( Mandatory = $false )]
        [string[]] $ArgumentList,

        [Parameter( Mandatory = $false )]
        [int] $Timeout = 30,

        [Parameter( Mandatory = $false )]
        [switch] $StringOutput
    )

    $arguments = New-Object System.Collections.ArrayList
    $arguments.Add( $Name ) | Out-Null
    $arguments.Add( $Command ) | Out-Null

    if ( $ArgumentList ) {
        $arguments.AddRange( $ArgumentList )
    }

    Invoke-ClientCommand 'exec', $arguments `
        -StringOutput:$StringOutput `
        -Timeout $Timeout |
    Write-Output

    Write-Verbose "Command on Docker container executed."
}