76

在 Windows PowerShell 上重定向标准输入/输出所需的语法是什么?

在 Unix 上,我们使用:

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

如何在 PowerShell 中执行相同的任务?

4

5 回答 5

93

您不能将文件直接挂接到标准输入,但您仍然可以访问标准输入。

Get-Content input.txt | ./program > output.txt
于 2012-08-03T02:33:58.190 回答
20

如果有人在寻找大文件的“获取内容”替代方案(如我),您可以在 PowerShell 中使用 CMD:

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

或者你可以使用这个 PowerShell 命令:

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

它将在同一窗口中同步运行程序。但是当我在 PowerShell 脚本中运行它时,我无法找到如何将这个命令的结果写入变量,因为它总是将数据写入控制台。

编辑:

要从 Start-Process 获取输出,您可以使用选项

-重定向标准输出

用于将输出重定向到文件,然后从文件中读取:

Start-Process ".\program.exe" -RedirectStandardInput ".\input.txt" -RedirectStandardOutput ".\temp.txt" -NoNewWindow -Wait
$Result = Get-Content ".\temp.txt"
于 2019-08-25T22:38:28.343 回答
10

对于输出重定向,您可以使用:

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

  command >> filename      APPEND into a file

  command 2> filename      Redirect Errors 

输入重定向以不同的方式工作。例如看到这个 Cmdlet http://technet.microsoft.com/en-us/library/ee176843.aspx

于 2012-07-12T08:30:10.787 回答
4

或者你可以这样做:

就像是:

$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"

如果您想知道进程是否出错,请添加以下代码:

$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
    }
}

当您需要处理外部程序/进程时,我发现这样我确实可以更好地处理脚本的执行。否则,我遇到了脚本会因某些外部进程错误而挂起的情况。

于 2019-09-27T18:52:27.180 回答
1

您也可以这样做以使标准错误和标准输出到同一个地方:

获取子项 foo 2>&1 >log

请注意,“>”与“| out-file”相同,默认编码为 un​​icode 或 utf 16。还要小心“>>”,因为它可以在同一个文本文件中混合 ascii 和 unicode。"| add-content" 可能比 ">>" 效果更好。“| set-content”可能比“>”更可取。

现在有6个流。更多信息: https ://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-5.1

我认为您所能做的就是保存到文本文件,然后将其读入变量。

于 2019-08-26T03:02:29.940 回答