Author Posts

February 3, 2016 at 6:52 am

in my script I use Invoke-Expression to run a third part command:

Invoke-Expression $command -OutVariable out
$out > C:\temp.txt

The command takes a long time and I need to post process the output; so I save the output in $out. I then find I have to pipe it to a file before using Get-Content file -raw to read the content for post processing.
The code works when I executed the script from ISE or turn it into a Module and again run it from ISE. But if I run the same module from "Windows Powershell" or "Powershell Console" the $out contains nothing; even though I can clearly see the output from the command is printed out to the screen.
I would appreciate your help with this.
many thanks

February 3, 2016 at 11:50 am

Hi Sina,

Can you write it this way:

$out = Invoke-Expression $command -OutVariable
$out > c:\temp.txt

I'm guessing this will work if you have defined your variables.

Take care

February 3, 2016 at 4:02 pm

I tried your suggestion but it fails to compile!

February 3, 2016 at 8:43 pm

$(Invoke-Expression $command -OutVariable out)

hope this should take care of it.

February 4, 2016 at 1:28 am

The problem with

$(Invoke-Expression $command -OutVariable out)

is it suppresses the console output until the command has finished executing; this command takes a long time to execute and I need to provide feedback during the execution of the command – that is why I chose to use the -OutVariable option. So unfortunately, I can't use this solution. I wonder if the issue has something to do with the length of data I need to store in $out. When I run the command in ISE the content of $out is below: is there a problem with this?

Parsing commands...
Successfully parsed 3 commands
 .
Executing command 'ccollab addchangelist'
Creating new review.
New review created: Review #91871: "Untitled Review"
Attaching changelists to review
SCM system is configured to Team Foundation Server
Checking client configuration.
Loading information for changelist `1234`
Ensuring changelist can be uploaded
Checking that you are allowed to upload files to this review
Uploading C1234 to Collaborator Server
Loading version control data
Loading version info for $/VelocityControl/Dev/Source/AbstractionLayer/vcast/common/vx6_9_sim_buildexecute.bat
Uploading Changelist to Collaborator server
$/VelocityControl/Dev/Source/AbstractionLayer/vcast/common/vx6_9_sim_buildexecute.bat
Associating C1234 with Review #91871
C1234 successfully attached to Review #91871: "Untitled Review"
Set review title to Review #91871: "C1234 - Added back timeout / delay which seems to allow tests to run on slower machines"
 
Executing command 'ccollab admin review edit'
Loading review ID 91871.
Set template to 'FBM249_Standard'
Set custom field 'Project ID'
Set custom field 'Project Name'.
 
Executing command 'ccollab browse'
Loading review ID 91871

February 5, 2016 at 10:27 am

I'll leave it to smarter brains to explain why it works this way, but anyone can replicate it easily.

$mycommand = "ping 8.8.8.8"
Invoke-expression $mycommand -outvariable out

From the ISE you get $out filled with everything that you see passed as standard output, from a console $out is simply null.

I'm sure there is a good reason for this, which we don't really need to know to resolve your current problem.
The functionality you really desire is covered by Tee-Object, which allows us to both capture the std out to a file AND pass it down the pipeline where it winds up getting sent out to the host.

$mycommand = "ping 8.8.8.8"
Invoke-expression $mycommand | Tee-Object -filepath c:\ToutTest.txt