为什么$ _不返回完整对象

时间:2018-08-12 18:57:16

标签: powershell oop

我是powershell的初学者,已经使用了仅仅几周了,当我看到它时,我在想$ _:

Get-ChildItem应该返回目录中的文件

PS C:\Users\Edu-mat\Powershell> Get-ChildItem


    Diretório: C:\Users\Edu-mat\Powershell


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       10/08/2018     13:38              7 Test0.txt
-a----       10/08/2018     13:42              5 Test1.txt
-a----       10/08/2018     13:42              7 Test2.txt
-a----       10/08/2018     13:43              8 Test3.txt

$ _表示管道中的当前对象。

但是当我做Get-ChildItem | %{write-host $_}时,输出结果与预期不符

PS C:\Users\Edu-mat\Powershell> Get-ChildItem | %{write-host $_}
Test0.txt
Test1.txt
Test2.txt
Test3.txt

为什么$ _不返回整个对象,它只是打印文件名?

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:7)

$_返回整个对象,但是Write-Host需要一个字符串,因此在该对象上调用了.ToString()方法。对于System.IO.FileInfo,其ToString()会被覆盖以输出文件名。

尝试一下,亲自看看:

Get-ChildItem | %{Write-Host $_.ToString()}

Get-ChildItem | %{Write-Host $_.GetType()}

Get-ChildItem | %{Write-Host $_.Mode}

答案 1 :(得分:4)

p = tuple(p)用于将信息写到控制台,因此对象的格式设置为字符串,类似于您完成Write-Host的操作(除了后者不直接写入主机,而是写入输出流)

如果您想直接写到控制台,但是如果隐式发送到控制台,将看到相同的格式,请按照mklement0的建议使用gci | % { "$_" }

Out-Host

他的完整评论:

  

我建议直接使用Get-ChildItem | Out-Host ;另外,也许令人惊讶   Out-Host并不总是与Write-Host "$_"相同,因为   后者导致Write-Host $_被调用,默认为   文化敏感的表示形式(如果有),而   PowerShell的字符串插值设计始终使用不变式   文化