为什么以下代码块的输出不同?在两种情况下,ConvertTo-Html cmdlet用作输入的对象都不相同吗?代码块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>
...
这就是管道的行为方式。
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
结论:使用管道的第一个版本是正确的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句