Michael Morgan
Michael Morgan

Reputation: 13

Combine outputs in Powershell

I currently have this script that checks the registry and if the key exists then it will output a value to the console. How can I modify this script so that it saves each output to a variable and then that variable will be exported to a text/csv file?

if ((Get-ItemPropertyValue -Path "HKLM:\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE" -Name HelpPane.exe) -eq '1')
{
    Write-Output 'Yes'
} 
else 
{
    Write-Output 'No'
}

if ((Get-ItemPropertyValue -Path "HKLM:\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DISABLE_SQM_UPLOAD_FOR_APP" -Name iexplore.exe) -eq '1')
{
    Write-Output 'Yes'
} 
else 
{
    Write-Output 'No'
}

if ($Host.Name -eq "ConsoleHost")
{
    Write-Host "Press any key to continue..."
    $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") > $null

Upvotes: 0

Views: 224

Answers (2)

postanote
postanote

Reputation: 16116

You have options.

3 ways to store and display PowerShell Variable simultaneously

https://ridicurious.com/2017/06/30/3-ways-to-store-display-results-infrom-a-powershell-variable-at-the-same-time

# Using -OutVariable parameter
Get-Process a* -OutVariable process

# PowerShell Variable squeezing
($process = Get-Process a*)

# Using Tee-Object Cmdlet
Tee-Object Cmdlet T’s results to o/p stream and Variable $process at the same time

Point of note: Avoid using Write-Host/echo, unless you are using screen text coloring. There is little reason to use it as output to the screen is the PowerShell default.

Also, if you are planning to use data down the line/ pipe, etc, then Write-Host empties the buffer and the data is gone. Well depending on what version of PowerShell you are using.

Resources:

From the creator of Powershell.

Write-Host Considered Harmful

http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful

... Jeffrey Snover changes his stance on this as of May 2016.

With PowerShell v5 Write-Host no longer "kills puppies". data is captured into info stream ...

https://twitter.com/jsnover/status/727902887183966208

https://learn.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Write-Information?view=powershell-5.1

Your code without the Write-Host thing.

if ((Get-ItemPropertyValue -Path 'HKLM:\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE' -Name HelpPane.exe) -eq '1')
{'Yes'} 
else {'No'}

if ((Get-ItemPropertyValue -Path 'HKLM:\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DISABLE_SQM_UPLOAD_FOR_APP' -Name iexplore.exe) -eq '1')
{'Yes'} 
else { 'No'}

if ($Host.Name -eq "ConsoleHost")
{
    'Press any key to continue...'
    $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyUp') > $null
}

Lastly, be cognizant about quoting. Single quotes for simple strings, and double quotes for variable expansion or other specific string handling.

As defined in the help files and other resources:

about_Quoting_Rules - PowerShell | Microsoft Docs

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules

A Story of PowerShell Quoting Rules

https://trevorsullivan.net/2016/07/20/powershell-quoting

Windows PowerShell Quotes

https://www.computerperformance.co.uk/powershell/quotes

Upvotes: 0

codewario
codewario

Reputation: 21488

Use Tee-Object for this, which moves data through the pipeline as well as saves it to a file:

$content | Tee-Object -FilePath C:\some\path\on\disk.txt

This will take your variable $content, pipe it to Tee-Object which writes the output to a file, then takes the same output and pushes it through the pipeline. You should see that $content is also written to the output stream in this case but you could also pass it to another cmdlet in the pipeline if you choose to do so.

Upvotes: 3

Related Questions