Powershell在类Unix管道中运行非cmdlet命令

时间:2018-11-04 23:58:02

标签: powershell perl

如果管道的右侧是cmdlet或在Powershell进程中运行的某项,则在准备就绪时会写出中间结果。但是,如果流水线的右侧是一个程序,则不是流水线中的两个程序同时进行的情况。为什么会这样呢?有没有一种方法可以在管道中运行多个外部程序,从而产生中间结果?

我有一个Perl脚本,该脚本递归地遍历从当前目录开始的所有目录并打印路径。

pfind.bat是一个批处理脚本,它使用类似于Unix类系统上的shebang pun的pun本身作为perl脚本执行。

@ REM = (<<'REM');
@ perl.exe %0 %*
@ goto :EOF
REM
undef @REM;
use strict;
use warnings;

use File::Find;

*STDERR = *STDOUT;

sub print_it {
    printf "%s\n", $File::Find::name;
    return 1;
}

find(\&print_it, q[.]);

但是,如果我使用/或其缩写\通过将表达式映射到上方来进行替换,它将以foreach作为分隔符而不是%来打印文件。行,然后pfind的输出行在发出时分别进行转换。

PS C:\> pfind | % {$_.replace("/", "\")}
.
.\hiberfil.sys
.\pagefile.sys
.\swapfile.sys

但是,如果我尝试使用perl.exe执行相同的操作,则在读取所有输出之前不会输出任何输出

PS C:\> pfind | perl.exe -pe 's,/,\\,g'

长时间不产生任何东西。

首先,为什么process1 | process2在Powershell下运行时不会产生中间结果?

其次,cmdlet似乎会产生中间结果,因为它们在Powershell进程中运行。是否存在某种形式的cmdlet可用于以流方式调用管道中的外部进程,即我是否可以编写Do-Pipeline 'pfind.bat' 'perl.exe -pe "s,/,\\,g"'或类似于直接Powershell的方法来建立管道?


✱shebangpun

#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
    if 0;

0 个答案:

没有答案