0

我想编写一个 PowerShell cmdlet 脚本,它的工作方式类似于Out-String,但具有无限的线宽,并且在行尾没有任何填充到特定宽度。

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

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

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

4

1 回答 1

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在(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 的限制 ;-)

于 2013-04-07T17:39:46.197 回答