【问题标题】:Why $ _ does not return the complete object为什么 $_ 不返回完整的对象
【发布时间】:2018-08-12 18:57:16
【问题描述】:

我是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

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

谁能解释一下。

【问题讨论】:

  • 您的第一个示例也没有显示整个对象,它缺少创建日期、完整目录名称、所有 NoteProperties(如 PSIsContainer)、所有方法、ScriptProperties...对象不适合屏幕,你看不到它们,你只能将它们的一部分变成文本并显示出来。 PowerShell 输出格式化程序采用一种方式,试图看起来像旧的命令提示符dir 命令,write-host 采用另一种方式,即来自 PowerShell 下的 .Net 框架。

标签: powershell oop


【解决方案1】:

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

试试这个,自己看看:

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

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

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

【讨论】:

    【解决方案2】:

    Write-Host 用于将信息写入控制台,因此对象被格式化为字符串,类似于您所做的gci | % { "$_" }(除了后者写入输出流而不是直接写入主机)。

    如果您想直接写入控制台,但如果隐式发送到控制台会看到相同的格式,请按照mklement0 的建议使用Out-Host:

    Get-ChildItem | Out-Host
    

    他的评论全文:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 2010-11-29
      • 2022-08-16
      • 2011-01-10
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多