如果管道的右侧是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;