如何编写类似于Out-String的cmdlet?

时间:2013-03-22 11:43:20

标签: powershell

我想编写一个类似于Out-String的PowerShell cmdlet脚本,但行宽不受限制,并且在行的末尾没有任何填充到特定宽度。

它应该具有类似下面的代码的输出,除了最好没有最大行宽,并且保留实际在行的输入中的任何尾随空格。

$x = ls;
[regex]::Replace(($x| Out-String -Width 1024), "\ +([\r\n])", '$1');

(如果您直接打印$x | Out-String -Width 1024,则可以在行尾看到额外的空格。)

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容轻松创建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(别名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,也无法了解其元素。
  • 将文件系统对象转换为字符串可以为您提供项目的相对路径。您无法访问该项目的full path,获取LastWriteTime,确定文件项的Length,甚至无法测试项目 是否为文件或一个目录(不进行额外的通话)。

事实上,唯一可以进行的安全转换是原始对象字符串。这也是唯一一个“尾随空白”的时候。

(换句话说,通常更好的做法是尽可能长时间地坚持使用对象,而不是试图模仿基于字符串的shell的限制; - )