我是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
为什么$ _不返回整个对象,它只是打印文件名?
有人可以解释一下吗?
答案 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的字符串插值设计始终使用不变式 文化