【问题标题】:How can I write a cmdlet similar to Out-String?如何编写类似于 Out-String 的 cmdlet?
【发布时间】:2013-03-22 11:43:19
【问题描述】:

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

它应该具有类似于以下代码的输出,但最好不要有最大行宽,并且保留实际在输入中的任何尾随空格。

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

(如果直接打印$x | Out-String -Width 1024,可以看到行尾多余的空格。)

【问题讨论】:

  • 当您可以简单地输出字符串时,为什么需要这样做?
  • 因为宽度为1024,所以有多余的空格。去掉width参数,多余的空格就消失了。使用 PowerShell,您无需动态分配数组。也没有无限字符串这样的东西。 “当你可以简单地输出一个字符串时,为什么需要这个?”
  • 默认宽度为 80,因此不使用它只会让事情变得更糟。

标签: powershell


【解决方案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 的限制 ;-)

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 2016-08-27
    • 2012-06-05
    • 2020-03-11
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2014-09-08
    • 2010-12-13
    相关资源
    最近更新 更多