Почему вывод следующих блоков кода отличается? Объект, который командлет ConvertTo-Html принимает в качестве входных данных, не является одинаковым в обоих случаях? Результат блока кода 1 - это то, что я ожидал.

Код 1:

$psdrive = Get-PSDrive
$psdrive | ConvertTo-Html

Код 2:

$psdrive = Get-PSDrive
ConvertTo-Html -InputObject $psdrive

Вот и выходы.

Выход 1:

 ...
     <tr>
        <th>Used</th>
        <th>Free</th>
        <th>CurrentLocation</th>
        <th>Name</th>
        <th>Provider</th>
        <th>Root</th>
        <th>Description</th>
        <th>MaximumSize</th>
        <th>Credential</th>
        <th>DisplayRoot</th>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>Alias</td>
        <td>Microsoft.PowerShell.Core\Alias</td>
        <td></td>
        <td>Drive that contains a view of the aliases stored in a session state</td>
        <td></td>
        <td>System.Management.Automation.PSCredential</td>
        <td></td>
    </tr>
    <tr>
        <td>72876965888</td>
        <td>12914372608</td>
        <td>Windows\system32</td>
        <td>C</td>
        <td>Microsoft.PowerShell.Core\FileSystem</td>
        <td>C:\</td>
        <td></td>
        <td></td>
        <td>System.Management.Automation.PSCredential</td>
        <td></td>
    </tr>
  ...

Выход 2:

   ...
      <tr>
        <th>Count</th>
        <th>Length</th>
        <th>LongLength</th>
        <th>Rank</th>
        <th>SyncRoot</th>
        <th>IsReadOnly</th>
        <th>IsFixedSize</th>
        <th>IsSynchronized</th>
    </tr>
    <tr>
        <td>12</td>
        <td>12</td>
        <td>12</td>
        <td>1</td>
        <td>System.Object[]</td>
        <td>False</td>
        <td>True</td>
        <td>False</td>
    </tr>
</table>
 ...
1
anderZubi 4 Ноя 2020 в 13:39

1 ответ

Лучший ответ

Вот как pipeline.

Get-PsDrive вернет массив (если имеется более одного диска).

$psdrive.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Используя конвейер $psdive (который следует называть $psdrives во множественном числе), вы передаете каждый отдельный элемент массива в ConvertTo-Html, поэтому они будут правильно отформатированы.

Передав фактический массив как -InputObject, он преобразует сам массив в HTML, поэтому вы видите элементы массива, такие как Count, Length и т. Д. получит тот же результат, если вы передадите пустой массив: ConvertTo-Html -InputObject @()

Вы можете легко увидеть это поведение, проверьте это:

# will return the members of the drives (Root, MaximumSize, ...)
$psdrive | Get-Member

# will return the members of the array that contains the drives (Add, Count, ...)
Get-Member -InputObject $psdrive

Вывод. Первая версия, использующая конвейер, - это правильный способ сделать это.

1
marsze 4 Ноя 2020 в 11:30