powershellpowershell-module

Displaying logs from when calling external commands from a powershell script


In a powershell module there is a class with the following method (here simplified). It simply calls docker to automatically build an image.

Everything works and the image is correctly built. What I cannot understand is why the logs from docker are not printed in the console (as they do if I call the same docker command directly instead of inside a powershell module).

[void] BuildImage() {
    $imageId = ...
    docker build -f ../Dockerfile . -t $imageId
}

Solution

  • You have a void method, it produces no output. If you want to send output to the success stream (stdout), then change the return type to [string[]] and use return:

    [string[]] BuildImage() {
        $imageId = ...
        return docker build -f ../Dockerfile . -t $imageId
    }
    

    If instead you're interested in sending the output to the other PowerShell streams, you could try the following example which includes redirection of errors then checks if the output type was an ErrorRecord it sends it to the error stream otherwise it sends it to the information stream.

    [void] BuildImage() {
        $imageId = ...
        docker build -f ../Dockerfile . -t $imageId 2>&1 | ForEach-Object {
            if($_ -is [System.Management.Automation.ErrorRecord]) {
                return Write-Error $_
            }
    
            Write-Host $_
        }
    }