gpt4 book ai didi

Powershell:自动调整大小和特定的列宽

转载 作者:行者123 更新时间:2023-12-02 08:34:53 26 4
gpt4 key购买 nike

基于这个 SO 问题 Powershell: Output collection of objects ,我能够在一列中用多行包装一组字符串。但是,当我尝试将集合输出到 TableView 时,自动调整大小不允许我指定特定的列宽。

例如:

id     name     items                                                          others
--- ---- ----- -----
01 a ("The first item", "The second item", "The third item", "...") ...
02 ....

这是我的输出:

$colObjs | Select-object id, name, items, others`
@{Expression={($_.items -join "`n")};Label="Items"} | `
Format-table -autosize -wrap

然后 items 列将是其数组中字符串的整个长度:

id     name     items                                                          others
--- ---- ----- -----
01 a "The first item" ...
"The second item" ....
"The third item"
...
02 ....

我尝试使用以下代码,items列的宽度仍然不符合预期:

$colObjs | Select-object id, name, items, others `
@{Expression={($_.items -join "`n")};Label="Items"} | `
Format-table id, name, `
@{expression={$_.items}; label="items"; width=18}, others `
-autosize -wrap

特别是,如果 items 有很长的字符串列表,表格 View 看起来非常难看,items 列中的空格太多。

这是我想要的格式:

id     name     items              others
--- ---- ----- -----
01 a "The first item" ...
"The second item" ....
"The third item"
...
02 ....

-autosize 会使宽度无效,这是真的吗?如何指定 items 的宽度并将其他列保留为自动调整大小?

最佳答案

这里的方法略有不同。循环遍历您的集合,为每个集合找到每个属性的计数并选择最高计数。通过那么多循环运行该集合,并在每个循环中创建一个自定义对象,其中每个属性检查它是否是一个数组。如果是,则迭代到该数组,如果不是,则检查这是否是第一轮自定义对象并返回值,否则返回空白。输出就是您要查找的内容,并且 -AutoSize for FT 完美运行。

首先我制作了一个类似于你的集合:

$col = @(

(New-Object –TypeName PSObject –Prop @{'id'='01';'name'='a';'items'=@(1,2,3);'others'=@('SampleA1','SampleA2')}),
(New-Object –TypeName PSObject –Prop @{'id'=@('02a','02b');'name'='b';'items'=@(1,2,3);'others'=@('SampleB1','SampleB2','SampleB3','SampleB4','SampleB5')}),
(New-Object –TypeName PSObject –Prop @{'id'='03';'name'=@('c1','c2');'items'=@(1,2,3);'others'='SampleC'})
)

然后我通过我建议的代码运行它:

$Col|%{
$Current = $_
$Members = $_|GM|?{$_.MemberType -match "Property"}|Select -ExpandProperty Name
$Rows = ($Members|%{$current.$_.count}|sort -Descending|Select -First 1)-1
For($i=0; $i -le $Rows;$i++){
$LoopObject = New-Object PSObject -Property @{$($Members[0]) = if($Current.$($Members[0]).count -gt 1){$Current.$($Members[0])[$i]}else{if(!($i -gt 0)){$Current.$($Members[0])}else{$Null}}}
If($Members.Count -gt 1){
$Members[1..$Members.count]|%{
Add-Member -InputObject $LoopObject -MemberType NoteProperty -Name $_ -Value $(if($Current.$_.count -gt 1){$Current.$_[$i]}else{if(!($i -gt 0)){$Current.$_}else{$Null}})
}
}
$LoopObject
}
}|FT ID,Name,Items,Others -AutoSize

它给了我这个输出:

id  name items others  
-- ---- ----- ------
01 a 1 SampleA1
2 SampleA2
3
02a b 1 SampleB1
02b 2 SampleB2
3 SampleB3
SampleB4
SampleB5
03 c1 1 SampleC
c2 2
3

编辑: 好的,更新了我的代码。它不再关心你扔给它的数组,它有多少属性,或者这些属性有多少属性。只要给定的集合仅包含字符串和/或数组,它就会输出所需的对象集合,就像我上面提到的输出一样。

关于Powershell:自动调整大小和特定的列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22723954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com