在PowerShell脚本中,我将一些对象传递给Format-Table
CmdLet。
我的脚本输出如下所示:
Something...
Operation AttributeName AttributeValue
--------- ------------- --------------
Delete Member John Doe
Something else...
由于字段的含义非常明显,我想从Format-Table的输出中删除标题,'---'分隔符和开头和结尾的空行。登记/> 我不认为CmdLet支持这个(或者至少如果有一个参数来做这个我找不到它)。
在Format-Table的输出中只留下具有实际值的行的最佳方法是什么?
答案 0 :(得分:26)
尝试-HideTableHeaders
参数Format-Table
:
gci | ft -HideTableHeaders
(我正在使用PowerShell v2。我不知道这是否在v1中。)
答案 1 :(得分:7)
遗憾的是,-HideTableHeaders
参数仍会导致打印空行(并且仍然会考虑表头的列宽)。我知道可以在这里可靠地工作的唯一方法是自己格式化输出:
| % { '{0,10} {1,20} {2,20}' -f $_.Operation,$_.AttributeName,$_.AttributeValue }
答案 2 :(得分:7)
试试-ExpandProperty
。例如,我使用它将clean变量发送到Out-Gridview -PassThru
,否则变量会存储标题信息。请注意,如果您想要返回多个属性,这些并不是很好。
一个例子:
Get-ADUser -filter * | select name -expandproperty name
或者,你可以这样做:
(Get-ADUser -filter * ).name
答案 3 :(得分:3)
以下是我如何解决这个问题。我只是将输出传递给Out-String,然后将该输出传递给.NET Trim函数:
(gci | ft -HideTableHeaders | Out-String).Trim()
这将删除表格前后的换行符。
如果你仍想要尾随换行符,你也可以使用TrimStart来处理标题的换行符。
(gci | ft -HideTableHeaders | Out-String).TrimStart()
答案 4 :(得分:1)
另一种方法是使用ForEach-Object将单个项目投影到字符串,然后使用Out-String CmdLet将最终结果投影到字符串或字符串数组:
gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String
#Result: One multi-line string equal to:
@"
CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0
CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d
CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b
CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426
"@
gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String -Stream
#Result: An array of single line strings equal to:
@(
"CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0",
"CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d",
"CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b",
"CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426")
这种方法的好处是你可以将结果存储到一个变量中,它不会有任何空行。
答案 5 :(得分:0)
我知道它已经晚了2年,但是这些答案帮助我制定了一个过滤函数来输出对象并修剪生成的字符串。由于我必须在最终解决方案中将所有内容格式化为字符串,所以我的处理方式略有不同。 长话,我的问题非常相似,看起来有点像这样
$verbosepreference="Continue"
write-verbose (ls | ft | out-string) # this generated too many blank lines
以下是我的例子:
ls | Out-Verbose # out-verbose formats the (pipelined) object(s) and then trims blanks
我的Out-Verbose函数如下所示:
filter Out-Verbose{
Param([parameter(valuefrompipeline=$true)][PSObject[]]$InputObject,
[scriptblock]$script={write-verbose "$_"})
Begin {
$val=@()
}
Process {
$val += $inputobject
}
End {
$val | ft -autosize -wrap|out-string |%{$_.split("`r`n")} |?{$_.length} |%{$script.Invoke()}
}
}
注1:此解决方案不会扩展到数百万个对象(它不能连续处理管道)
注意2:您仍然可以添加-noheaddings选项。 如果你想知道为什么我在这里使用了一个scriptblock,那就是允许重载,比如发送到磁盘文件或其他输出流。