您可以轻松地创建一个“简洁”的实现,Out-String
例如:
filter ConvertTo-String { "$_" }
这会将传递给过滤器的任何对象强制转换为字符串(使用 PowerShell 字符串扩展来调用ToString
非空对象,并更改$null
为空字符串)。
对以下五个元素的示例输入运行过滤器,过滤器会将它们转换为相应的字符串值(整数变为'1'
、双精度'2.3'
、空值''
、字符串'four'
和哈希表'System.Collections.Hashtable'
):
1,2.3,$null,'four',@{five=6} | ConvertTo-String
Get-ChildItem
在(alias )
的输出上运行过滤器ls
会产生类似的结果:
PS> Get-ChildItem
Directory: C:\Windows\System32\WindowsPowerShell\v1.0
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 13 Jul 2009 11:56 PM en-US
d---- 13 Jul 2009 11:52 PM Examples
d---- 13 Jul 2009 11:52 PM Modules
-a--- 13 Jul 2009 8:14 PM 452608 powershell.exe
-a--- 12 May 2012 10:28 AM 436 powershell.exe.config
...
PS> Get-ChildItem | ConvertTo-String
en-US
Examples
Modules
powershell.exe
powershell.exe.config
...
当您将对象转换为字符串时,您会丢失对象最初包含的信息和功能:
- 将哈希表转换为字符串只会为您提供其类型名称。您无法访问
Count
哈希表,也无法了解有关其元素的任何信息。
- 将文件系统对象转换为字符串为您提供了请求项的相对路径。您无法访问项目的完整路径、获取
LastWriteTime
、确定Length
文件项目的位置,甚至无法测试项目是文件还是目录(无需进行额外调用)。
事实上,唯一可以进行的安全转换是原始对象是字符串。这也是唯一一次会有“尾随空格”。
(换句话说,通常最好的做法是尽可能长时间地坚持使用对象,而不是试图模仿基于字符串的 shell 的限制 ;-)