2013-03-22 36 views
0

我想编写一个像Out-String一样运行的PowerShell cmdlet脚本,但它的行宽无限制,并且在行末尾没有任何填充以指定宽度。如何编写类似Out-String的cmdlet?

它应该具有如下代码的输出,但最好不会有最大行宽,并且任何实际在输入中的行的末尾空白都将被保留。

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

(如果您直接打印$x | Out-String -Width 1024,你可以看到多余的空格在线条的末端。)

+0

这是为什么需要时即可只需输出一个字符串? – 2013-03-22 14:14:54

+0

因为宽度是1024,所以还有额外的空间。摆脱宽度参数和额外的空间会消失。使用PowerShell,您不需要动态分配数组。也没有这种东西无限的字符串。 “为什么需要这样做,只要输出一个字符串?” – 2013-03-22 22:49:52

+0

默认宽度为80,因此将它关闭会让事情变得更糟。 – 2013-03-23 11:58:00

回答

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,甚至测试项目是否一个文件或目录(未做其他调用)。

事实上,可以作出的唯一安全的转换是,如果原来的对象一个字符串。这也是唯一一次会出现“尾随空白”。

(换句话说,它通常是更好的做法,坚持,只要有可能,而不是试图仿效基于字符串的炮弹;-)的限制对象

相关问题