96

What is the required syntax to redirect standard input/output on Windows PowerShell?

On Unix, we use:

$./program <input.txt >output.txt

How do I execute the same task in PowerShell?

JasonMArcher
  • 14,195
  • 22
  • 56
  • 52
Nitin
  • 2,624
  • 7
  • 29
  • 43
  • 1
    related: http://stackoverflow.com/questions/16098366/can-i-send-some-text-to-the-stdin-of-an-active-process-under-windows – eckes Jun 15 '16 at 12:38

5 Answers5

115

You can't hook a file directly to stdin, but you can still access stdin.

Get-Content input.txt | ./program > output.txt
JasonMArcher
  • 14,195
  • 22
  • 56
  • 52
28

If there is someone looking for 'Get-Content' alternative for large files (as me) you can use CMD in PowerShell:

cmd.exe /c ".\program < .\input.txt"

Or you can use this PowerShell command:

Start-Process .\program.exe -RedirectStandardInput .\input.txt -NoNewWindow -Wait

It will run the program synchronously in same window. But I was not able to find out how to write result from this command to a variable when I run it in PowerShell script because it always writes data to the console.

EDIT:

To get output from Start-Process you can use option

-RedirectStandardOutput

for redirecting output to file and then read it from file:

Start-Process ".\program.exe" -RedirectStandardInput ".\input.txt" -RedirectStandardOutput ".\temp.txt" -NoNewWindow -Wait
$Result = Get-Content ".\temp.txt"
Siarhei Kavaleuski
  • 1,450
  • 14
  • 15
10

For output redirection you can use:

  command >  filename      Redirect command output to a file (overwrite)

  command >> filename      APPEND into a file

  command 2> filename      Redirect Errors 

Input redirection works in a different way. For example see this Cmdlet http://technet.microsoft.com/en-us/library/ee176843.aspx

iSamnium
  • 376
  • 1
  • 3
5

Or you can do:

something like:

$proc = Start-Process "my.exe" "exe commandline arguments" -PassThru -wait -NoNewWindow -RedirectStandardError "path to error file" -redirectstandardinput "path to a file from where input comes"

if you want to know if process errored out, add following code:

$exitCode = $proc.get_ExitCode()

if ($exitCode){
    $errItem = Get-Item "path to error file"
    if ($errItem.length -gt 0){
        $errors = Get-Content "path to error file" | Out-String
    }
}

I find that this way I do have a better handle on execution of your scripts, when you need to handle external program/process. Otherwise I have encountered situations where script would hang out on some of external process errors.

Damir
  • 53
  • 1
  • 4
1

You can also do this to have standard error and standard out go to the same place (note that in cmd, 2>&1 must be last):

get-childitem foo 2>&1 >log

Note that ">" is the same as "| out-file", and by default the encoding is unicode or utf 16. Also be careful with ">>", because it can mix ascii and unicode in the same text file. "| add-content" probably works better than ">>". "| set-content" might be preferable to ">".

There's 6 streams now. More info: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-5.1

I think all you can do is save to a text file and then read it into a variable after.

js2010
  • 23,033
  • 6
  • 64
  • 66