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

Powershell 如何编写类似于Out String的cmdlet?,powershell,Powershell,我想编写一个PowerShell cmdlet脚本,该脚本的工作方式类似于Out String,但具有不受限制的行宽,并且在行尾没有任何特定宽度的填充 它的输出应该与下面的代码类似,但最好没有最大线宽,并且保留行输入中实际存在的任何尾随空格 $x = ls; [regex]::Replace(($x| Out-String -Width 1024), "\ +([\r\n])", '$1'); (如果您直接打印$x | Out String-Width 1024,您可以在行尾看到额外的空格。)

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

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

$x = ls;
[regex]::Replace(($x| Out-String -Width 1024), "\ +([\r\n])", '$1');
(如果您直接打印
$x | Out String-Width 1024
,您可以在行尾看到额外的空格。)

您可以轻松创建一个“无装饰”的实现,例如:

filter转换为字符串{“$\”
这会将传递到筛选器的任何对象强制为字符串(使用PowerShell字符串扩展调用非空对象,并将
$null
更改为空字符串)

在下面五个元素的示例输入上运行过滤器,过滤器将把它们转换为相应的字符串值(整数变成
'1'
、双精度
'2.3'
、null
'
、字符串
'four'
、以及哈希表
'System.Collections.hashtable'
):

1,2.3,$null,'four',@{five=6}转换为字符串

对(别名
ls
)的输出运行筛选器会产生类似的结果:

PS>获取子项
目录:C:\Windows\System32\WindowsPowerShell\v1.0
模式LastWriteTime长度名称
----                -------------     ------ ----
美国2009年7月13日下午11:56
d---2009年7月13日下午11:52示例
d---2009年7月13日下午11:52模块
-a---2009年7月13日下午8:14 452608 powershell.exe
-a--2012年5月12日上午10:28 436 powershell.exe.config
...
PS>获取子项|转换为字符串
恩美
例子
模块
父进程
powershell.exe.config
...

将对象转换为字符串时,将丢失对象最初包含的信息和功能:

  • 将哈希表转换为字符串只会给出它的类型名。您无法访问哈希表的名称,也无法了解有关其元素的任何信息
  • 将文件系统对象转换为字符串将为您提供请求该对象的项目的相对路径。您无法访问项目的,获取,确定文件项目的,甚至测试项目是文件还是目录(不进行其他调用)
事实上,可以进行的唯一安全转换是,如果原始对象是字符串。这也是唯一一次出现“尾随空格”


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

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