Fix multi-line input w/ redirected stdin (#2090)
The input loop reading from stdin did not handle multi-line input correctly because it was adding a newline character where none was expected. The fix was to not include the final newline character to accept input, just like Console.ReadLine or PSReadline would.
This commit is contained in:
parent
22aac12c3e
commit
cf18010ad5
2 changed files with 22 additions and 8 deletions
|
@ -1557,6 +1557,7 @@ namespace Microsoft.PowerShell
|
||||||
if (initialContent != null)
|
if (initialContent != null)
|
||||||
{
|
{
|
||||||
sb.Append(initialContent);
|
sb.Append(initialContent);
|
||||||
|
sb.Append('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
|
@ -1579,7 +1580,11 @@ namespace Microsoft.PowerShell
|
||||||
if (!NoPrompt) Console.Out.Write('\n');
|
if (!NoPrompt) Console.Out.Write('\n');
|
||||||
Console.In.Read();
|
Console.In.Read();
|
||||||
}
|
}
|
||||||
sb.Append('\n');
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1591,12 +1596,6 @@ namespace Microsoft.PowerShell
|
||||||
{
|
{
|
||||||
sb.Append(c);
|
sb.Append(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (c == '\n')
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
|
|
@ -263,8 +263,23 @@ Describe "ConsoleHost unit tests" -tags "Feature" {
|
||||||
$si = NewProcessStartInfo "-noprofile -" -RedirectStdIn
|
$si = NewProcessStartInfo "-noprofile -" -RedirectStdIn
|
||||||
$process = RunPowerShell $si
|
$process = RunPowerShell $si
|
||||||
$process.StandardInput.Write("1+1`n")
|
$process.StandardInput.Write("1+1`n")
|
||||||
|
$process.StandardOutput.ReadLine() | Should Be "2"
|
||||||
|
|
||||||
|
# Multi-line input
|
||||||
|
$process.StandardInput.Write("if (1)`n{`n 42`n}`n`n")
|
||||||
|
$process.StandardOutput.ReadLine() | Should Be "42"
|
||||||
|
$process.StandardInput.Write(@"
|
||||||
|
function foo
|
||||||
|
{
|
||||||
|
'in foo'
|
||||||
|
}
|
||||||
|
|
||||||
|
foo
|
||||||
|
|
||||||
|
"@)
|
||||||
|
$process.StandardOutput.ReadLine() | Should Be "in foo"
|
||||||
|
|
||||||
$process.StandardInput.Close()
|
$process.StandardInput.Close()
|
||||||
$process.StandardOutput.ReadToEnd() | Should Be "2${nl}"
|
|
||||||
EnsureChildHasExited $process
|
EnsureChildHasExited $process
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue