dwwilson66
dwwilson66

Reputation: 7066

Why will Powershell write to the console, but not to a file?

I have a PowerShell script that sets flags based on various conditions of the file. I'll abbreviate for brevity.

$path = "c:\path"
$srcfiles = Get-ChildItem $path -filter *.htm*

ForEach ($doc in $srcfiles) {

$s = $doc.Fullname

Write-Host "Processing :" $doc.FullName

if (stuff) {flag 1 = 1} else {flag 1 = 0}
if (stuff) {flag 1 = 1} else {flag 1 = 0}
if (stuff) {flag 1 = 1} else {flag 1 = 0}

$t = "$s;$flag1;$flag2;$flag2"

Write-Host "Output: " $t

This all works great. My file processes, the flags are set properly, and a neat semicolon delimited line is generated as $t. However, if I slap these two lines at the end of the function,

$stream = [System.IO.StreamWriter] "flags.txt"
$stream.WriteLine $t    

I get this error.

Unexpected token 't' in expression or statement.
At C:\CGC003a.ps1:53 char:25
+     $stream.WriteLine $t <<<<
    + CategoryInfo          : ParserError: (t:String) [], ParseException
    + FullyQualifiedErrorId : UnexpectedToken

If I'm reading this write, it appears that write-host flushed my variable $t before it got to the WriteLine. Before I try out-file, though, I want to understand what's happening to $t after Write-Host that prevents Write Line from seeing it as valid. Or is there something else I'm missing?

Upvotes: 1

Views: 5005

Answers (2)

terry
terry

Reputation: 1587

you could try

$t > c:\path\to\flags.txt

Upvotes: 0

CB.
CB.

Reputation: 60918

try:

$stream.WriteLine($t)   

writeline is a method of streamwriter .net object. To pass in value you need to enclose it in ( )

-if you need to append to a streamwriter you need to create it like this:

$a = new-object 'System.IO.StreamWriter' -ArgumentList "c:\path\to\flags.txt",$true

Where the boolean arguments can be true to append data to the file orfalse to overwrite the file.

I suggest to pass full path for:

$stream = [System.IO.StreamWriter] "c:\path\to\flags.txt"

otherwise you create the file in .net current folder ( probably c:\windows\system32 if run as administrator your current powershell console, to know it type [System.IO.Directory]::GetCurrentDirectory())

Upvotes: 6

Related Questions