Author Posts

January 1, 2012 at 12:00 am

by energy99 at 2012-11-21 13:25:02

I would like to cleanup the final report by having a blank line between each servers results. I have been using the following code:

get-content “c:\servers.txt” | %{$_ >> c:\Summary.txt; get-content "\\$_\c$\results.txt" >>c:\Summary.txt}

The above works great but when I view the Summary.txt file it lists all the necessary data but I would lke to change the formatting to have a blank line between the results from each of the servers listed from the E:\servers.txt file. For example:

Right now:

severname
results
servername
results
severname
results

I would like it to read:

servername
results

servername
results

servername
results

by DonJ at 2012-11-21 13:29:19

Write a "`n" (backtick-N in double quotes) for a blank line.

by energy99 at 2012-11-21 14:14:04

Any idea where in the line of code provided I would place the "`n" ? I've tried in numerous spots but still does not create a blank line between the data.

by DonJ at 2012-11-21 14:26:29

Yeah, so the underlying problem is that you're asking PowerShell to do something it doesn't terribly like, which is deal with plain text. It likes objects. It isn't really meant to produce textual reports like this, so you have to fiddle with it a lot sometimes.

You're also using a lot of shortcuts, so just in the interest of making this more readable to someone else who might come along and read this in the future...


$servers = Get-Content c:\servers.txt
foreach ($server in $servers) {
$server | out-file results.txt -append
get-content "\\$_\c$\results.txt" | out-file results.txt -append
"`n`n" | out-file results.txt -append
}

Is what I might try if I had PowerShell right in front of me right now – which sadly, I don't, so you'll have to let me know how it works out. I added a couple of blank lines there just to kind of exaggerate the effect. You can probably re-construct that into a one-liner if that's what you're after. Basically just another semicolon in your ForEach-Object script block.

by energy99 at 2012-11-22 07:45:37

not having much luck with the above... what it does is open the servers.txt file in notepad and show me the contents of servers.txt.

by DexterPOSH at 2012-11-22 14:13:20

Hi Energy99,

I tried this using a simple approach. Let's say there is a file Servers.txt with three server names in it and there is a result file on these servers with some result.
So what I did is prefixed the $server with a "`n" character, the only downside with this is that the first server will also have a space:

$servers = Get-Content .\servers.txt
foreach ($server in $servers) {
"`n$server" | out-file -Append .\summary.txt
Get-Content "\\$Server\C$\results.txt" | Out-File .\summary.txt -Append
}

So this gives me output something like this
PS C:\TEMP> gc .\summary.txt

Server1
Result 1

Server2
Result 2

Server3
Result 3

Hope this helps
~Cheers~

by energy99 at 2012-11-23 07:51:06

Perfect, thank you!

by nohandle at 2012-11-23 12:43:08

If you specify the read count paremeter on the get-content cmdlet it serves two lines at a time (as array of strings). so the only thing you has to do is to add blank (not `n) after each pair. And capture it to the output of course.
Get-Content -Path "C:\temp\txt.txt" -ReadCount 2 | ForEach-Object{$_;""} | Out-File -Append -FilePath 'C]

Still one extra line on the end, though.

by nohandle at 2012-11-23 13:34:30

And if anybody wonders how to do it without adding blank line after the last line. And IMHO more readable
function AddBlank ([string]$Path)
{
$lines = Get-Content -Path $Path
for ($index=0; $index -lt $lines.Length; ++$index)
{
$lines[$index]
#if index is odd and the line is not the last add blank
#-1 because indexing from zero
if (($index%2) -and ($index -ne ($lines.Length-1)))
{
Write-Output ""
}
}
}
AddBlank -path 'C:\temp\txt.txt' |out-file -Append -FilePath 'C]

I know the name is not according the powershell verb-noun best practice.