是否有方法对Powershell cmdlet的结果进行文字包装?

是否有方法对Powershell cmdlet的结果进行文字包装?,powershell,Powershell,简单的(可能是愚蠢的)问题。我是一名Powershell新手,主要使用它来实例化托管库,这样当我需要使用托管库中的成员时,就不必编写小应用程序。这些库中的一些是旧的,并且具有长而痛苦的签名的方法。在实例化新对象后使用get member,我经常遇到如下令人沮丧的结果: PS> $object | get-member MethodWithLongSignature TypeName: SomeLib.SomeObject Name Member

简单的(可能是愚蠢的)问题。我是一名Powershell新手,主要使用它来实例化托管库,这样当我需要使用托管库中的成员时,就不必编写小应用程序。这些库中的一些是旧的,并且具有长而痛苦的签名的方法。在实例化新对象后使用get member,我经常遇到如下令人沮丧的结果:

PS> $object | get-member MethodWithLongSignature

TypeName: SomeLib.SomeObject

Name                      MemberType Definition
----                      ---------- ----------
MethodWithLongSignature   Method     System.Void MethodWithLongSignature(string param1, int param2, string param3, string param4, stri....

有没有办法包装get member的结果?或者,是否有一个get成员开关,该开关将以不换行的方式生成结果?

表格结构中的输出将自动格式化以适应屏幕的宽度,必要时在过程中截断长值

将结果导入
格式列表
命令,以获取结果的详细垂直格式

PS> $object | get-member MethodWithLongSignature | format-list

Format表有一个-Wrap开关来包装最后一列。由于Get成员输出的最后一列已经相当大,这将产生可读的结果

PS> $object | get-member MethodWithLongSignature | format-list
另一个选项是格式宽度(但它不换行,因此您仅限于控制台宽度):


您也可以尝试格式化表格换行,如:


(get process-id 3104).startinfo.EnvironmentVariables | format table-wrap

我找不到内置的可以任意宽度换行的东西,所以我写了一个-有点冗长,但这里是:

function wrapText( $text, $width=80 )
{
    $words = $text -split "\s+"
    $col = 0
    foreach ( $word in $words )
    {
        $col += $word.Length + 1
        if ( $col -gt $width )
        {
            Write-Host ""
            $col = $word.Length + 1
        }
        Write-Host -NoNewline "$word "
    }
}

基于Leo的答案,我决定制作一个
wordwrap
cmdlet


函数换行{
[CmdletBinding()]
Param(
[参数(必需=1,ValueFromPipeline=1,ValueFromPipelineByPropertyName=1)]
[Object[]]$chunk
)
过程{
$Lines=@()
foreach($chunk中的行){
$str=''
$counter=0
$line-拆分'\s+'|%{
$counter+=$\长度+1
if($counter-gt$Host.UI.RawUI.BufferSize.Width){
$Lines+=,$str.trim()
$str=''
$计数器=$\长度+1
}
$str=“$str$\ux”
}
$Lines+=,$str.trim()
}
$line
}
}
它可以通过将字符串或字符串数组作为函数参数传递,也可以通过管道传递。示例:

$str=“Lorem ipsum door sit amet,concetetur adipiscing elit。”*5
单词包装$str
$str |字包装
获取内容txtfile.txt |?{$| |排序|换行

函数顶部的元数据注释块允许
get help wrap
显示一些有用的信息。有关定义管道cmdlet的详细信息。

您也可以使用“PowerShell Tools for Visual Studio 2015”扩展在VS 2015中运行PowerShell脚本


这为您提供了VS编辑器的所有功能、文字包装、调试、智能感知等。

我喜欢@Leo&@rojo答案背后的意图,但拆分行不适合大量文本,而状态机(或者更好的是,一个易于编程的机器..如regex)将更加高效

在编写我自己的复杂解决方案的基础上,我保证了它的复杂性,因为它在原始字符串中保留了换行符,甚至允许您在某些字符上强制换行

在这里,我尝试打断大约30个字符,查找最近的空格,但也强制在句号处打断,忽略单词中的句点,并确保不会打断由于句点而已经中断的行

Lorem Ipsum is simply dummy
text of the printing and
typesetting industry.
Lorem Ipsum has been the
industry's standard dummy text
ever since the 1500s, when an
unknown printer took a galley
of type and scrambled it to
make a type specimen book.
It has survived not only five
centuries, but also the leap
into electronic typesetting,
remaining essentially
unchanged.
It was popularised in the
1960s with the release of
Letraset sheets containing
Lorem Ipsum passages, and more
recently with desktop
publishing software like Aldus
PageMaker including versions
of Lorem Ipsum.
这里是函数本身,但是请注意,您需要在这个答案的底部添加一些内容来生成正则表达式(我把它放得更高,这样您就可以读取参数)

函数换行{
Param(
[int]$Length=80,
[int]$Step=5,
[char[]]$Force,
[参数(位置=0)][字符串]$Text
)
$key=“$Length$Step$Force”
$wrap=$\u wrap[$key]
如果(!$wrap){
$wrap=$\u wrap[$key]=\u wrap`
-长度$Length`
-步骤$Step`
-Force($Force-join“”)`
|Concat-Join'|'-Wrap'(',')(?:[^\n\r\S])+'
}
返回$Text-替换$wrap,$\u wrap[“”]
}
这里有一些更有意义的东西来展示它的多样性。
不要担心脚本的其余部分,它是,或。
它基本上执行一系列ping、tcp检查和http请求,并将错误消息放入
info
属性:

$\uux.info=(
$style.bf.yellow`
(包裹-长度55-力':.$信息)`
$COLOR`
|(康卡特)

您将需要上述
Wrap

函数Concat{
参数([开关]$Newlines,$Wrap,$Begin='',$End='',$Join='')
开始{
如果($Newlines){
$Join=[System.Environment]::换行符
}
$output=[System.Text.StringBuilder]::new()
$deliniate=$False
如果(!$Wrap){
$output.Append($Begin)| Out Null
}
elseif($Wrap-is[string]){
$output.Append($End=$Wrap))| Out Null
}
否则{
$output.Append($Wrap[0])| Out Null
$End=$Wrap[1]
}
}
过程{
if(!($\u=[string]$\ux).length){
}
elseif($deliniate){
$output.Append($deliniate)| Out Null
$output.Append($|)Out Null
}
否则{
$deliniate=$Join
$output.Append($|)Out Null
}
}
结束{
$output.Append($End.ToString())
}
}
$\u WRAP=@{'=“`$1$([System.Environment]::NewLine)”}
函数包{
参数($Length,$Step,$Force)
$wrap=$Force-join'-替换'\\\\\;]\'-','\$0'
$chars=“^\n\r$wrap”
$preExtra=“[$chars\S]*”
$postExtra=“[^\s$wrap]”
$chars=“[$chars]”
$postChars=“$preExtra$postExtra”
如果($wrap){
$wrap=“[$wrap]”
$wrap
$wrap=“$wrap(?=\S)”
Lorem Ipsum is simply dummy
text of the printing and
typesetting industry.
Lorem Ipsum has been the
industry's standard dummy text
ever since the 1500s, when an
unknown printer took a galley
of type and scrambled it to
make a type specimen book.
It has survived not only five
centuries, but also the leap
into electronic typesetting,
remaining essentially
unchanged.
It was popularised in the
1960s with the release of
Letraset sheets containing
Lorem Ipsum passages, and more
recently with desktop
publishing software like Aldus
PageMaker including versions
of Lorem Ipsum.