我想编写一个类似于Out-String
的PowerShell cmdlet脚本,但行宽不受限制,并且在行的末尾没有任何填充到特定宽度。
它应该具有类似下面的代码的输出,除了最好没有最大行宽,并且保留实际在行的输入中的任何尾随空格。
$x = ls;
[regex]::Replace(($x| Out-String -Width 1024), "\ +([\r\n])", '$1');
(如果您直接打印$x | Out-String -Width 1024
,则可以在行尾看到额外的空格。)
答案 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
,也无法了解其元素。LastWriteTime
,确定文件项的Length
,甚至无法测试项目 是否为文件或一个目录(不进行额外的通话)。事实上,唯一可以进行的安全转换是原始对象是字符串。这也是唯一一个“尾随空白”的时候。
(换句话说,通常更好的做法是尽可能长时间地坚持使用对象,而不是试图模仿基于字符串的shell的限制; - )