Псевдоним cat
для Get-Content
был введен по соображениям удобства (я полагаю, чтобы пользователи Unix чувствовали себя более комфортно с PowerShell).Это не заставляет Get-Content
вести себя точно так же, как команда Unix cat
.Командлет, в частности, не отображает ввод строки из конвейера:
PS C:\Temp> <b>'foo' | cat</b>
<i>cat : The input object cannot be bound to any parameters for the command either
because the command does not take pipeline input or the input and its properties
do not match any of the parameters that take pipeline input.</i>
At line:1 char:9
+ 'foo' | cat
+ ~~~
Вот для чего Write-Output
(или его псевдоним echo
):
PS C:\Temp> <b>'foo' | Write-Output</b>
foo
Параметры по умолчаниюGet-Content
, которые принимают входные данные конвейера, равны -Path
и -LiteralPath
соответственно, оба из которых ожидают допустимый путь.
При более внимательном рассмотрении вывода Get-Content
вы заметите, что объекты имеютне только обычные свойства строковых объектов, но также некоторые свойства с информацией о файле, из которого были прочитаны данные, в частности PSPath
:
PS C:\Temp> <b>4..6 > out.txt</b>
PS C:\Temp> <b>cat .\out.txt</b>
4
5
6
PS C:\Temp> <b>cat .\out.txt | Get-Member</b>
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
...
<i>PSChildName NoteProperty string PSChildName=out.txt
PSDrive NoteProperty PSDriveInfo PSDrive=C
PSParentPath NoteProperty string PSParentPath=C:\Temp
<b>PSPath NoteProperty string PSPath=C:\Temp\out.txt</b>
PSProvider NoteProperty ProviderInfo PSProvider=Microsoft.PowerShell.Core\FileSystem</i>
ReadCount NoteProperty long ReadCount=1
Chars ParameterizedProperty char Chars(int index) {get;}
Length Property int Length {get;}
Свойство PSPath
является тем, что служит входомдля второго Get-Content
, вызывая каждую строку из входного файла для запуска другого Get-Content
того же файла.Однако выходные объекты из первого Get-Content
также имеют свойство ReadCount
(указывающее количество строк, которые уже были прочитаны из файла), что также является параметром Get-Content
.Из-за этого второй Get-Content
не читает входной файл точно так же, как первый.При ReadCount=2
считываются 2 строки из файла за раз, при ReadCount=3
по 3 строки читаются одновременно и т. Д.
PS C:\Temp> <b>cat .\out.txt | cat</b>
4 <i># ← input line 1 ("4"), ReadCount = 1, 1st read (returns "4")</i>
5 <i># ← input line 1 ("4"), ReadCount = 1, 2nd read (returns "5")</i>
6 <i># ← input line 1 ("4"), ReadCount = 1, 3rd read (returns "6")</i>
4 <i># ← input line 2 ("5"), ReadCount = 2, 1st read (returns "4", "5")</i>
5
6 <i># ← input line 2 ("5"), ReadCount = 2, 2nd read (returns "6")</i>
4 <i># ← input line 3 ("6"), ReadCount = 3, 1st read (returns "4", "5", "6")</i>
5
6
Из-за этого выполняются дополнительные шаги конвейера (cat .\out.txt | cat | cat ...
) не выводить n m строк вывода (n
- количество строк в файле и m
количество шагов конвейера).