Home
Options

What does Util.Cmd( ..., StreamResults: true) do?

I have a script which calls an external program that takes a while and writes quite a few lines to console and I thought that this option would start displaying the output at once rather than waiting until the program had finished.

Later on when I was had more throughly debugged the script I change it not to dump the output from the cmd.

But this seems to have the effect of not actually running the command!.

An example

System.IO.File.Delete("testfile");

var output = Util.Cmd("echo hello > testfile", streamResults: true); 

System.IO.File.Exists("testfile").Dump();

output.Dump();
System.IO.File.Exists("testfile").Dump();
 

outputs

False
(0 items)
True

showing that the testfile is not created until after the output is dumped (or until I called something like output.ToArray())

Can anyone explain?

Comments

  • Options

    That's correct behavior. If streamResults is true, you get back a lazy IEnumerable with standard streaming/iterator/pipe semantics. This means that you can access results before the command has completed - and is potentially more efficient in that the results are not stored in memory - however you have to start enumerating the results in order to start the operation (also, the command may block if you don't enumerate the results fast enough).

  • Options

    Thanks.

    I think I have been exceedingly dense. I sat looking in ILSpy at the code

    public static IEnumerable Cmd(string commandText, string args, Encoding encoding, bool quiet = false, bool streamResults = false)
    {
        IEnumerable enumerable = CmdCore(commandText, args, quiet, encoding);
        if (!streamResults)
        {
            enumerable = enumerable.ToArray();
        }
        return new CmdResults(enumerable);
    }
    

    and thought, it doesn't actually pass streamResults to CmdCore, so how can it stop the process from starting?

    Completely overlooked the return value which makes all the difference!

    Doh!.

Sign In or Register to comment.