how to output a string to variable and console at the same time

There are so many ways to get your end goal:

In your script just have something like this:

"Process started"
<step1>
"Doing step 1"
<step2>
"Doing step 2"
...

Then run the script as

.\test.ps1 | Tee-Object -file log.txt

Note that the output is available to Tee-Object and hence the console as and when it occurs. You don't get the output only after the entire script runs. This is how pipeline works in Powershell. Objects are passed along downstream as and when they occur. Insert a sleep 10 in between as steps and see that the output comes as soon as it is available.

Also, you don't necessarily have to have another script ( the launcher.ps1 ) you are talking about. You can use functions, scriptblock etc. within your script.

Some other ways:

function test {

"Process started"
sleep 5
"Doing step 1"
sleep 5
"Doing step 2"

}

test | %{$output+=$_;$_}
#use output
write-host -fore blue $output

You can create a filter:

$script:output = ""

filter appendOutput {

    $script:output+= $_
    return $_
}

"Process started" | appendOutput
sleep 5
"Doing step 1" | appendOutput
sleep 5
"Doing step 2" | appendOutput
#use output
write-host -fore blue $script:output

There are probably many more ways of doing this.


Here's a nice trick, enclose your variable assignment in parenthesis. You can find more on this in the PowerShell language specification (section 7.1.1 Grouping parentheses) available to download here :

PS > ($var=1)
1
PS >

I haven't messed with powershell enough to give a concrete answer, but if I were to do this in C I would exploit side effects.

//Psuedo-C
string con (oldString, newString) {
  print(newString);
  return oldString + newString;
}

Use function like so:

myString = con(myString, "Process started");

It would have the desired effect. (leaving aside correct C syntax and pedantry such as dealing with newlines) I don't know how to translate this to powershell.

What you want to do may be considered messy however. It might be clearer if you just explicitly output and log output and log one after the other in your code. Side effects inevitably come back to bite you. Keep things modular.

Tags:

Powershell