【发布时间】:2014-06-11 05:29:11
【问题描述】:
使用 POSH 3.0,作为一个简单的示例,如果我填充一个数组并尝试使用 FT -Autosize 显示结果,之后我将无法再访问该变量。有很多属性要显示,所以 -autosize 对利用整个宽度很重要。
$x | Select @{E={$_.AID};L="Action"},@{E={$_.ID};L="SSN"}... | `
FT -AutoSize
}
#Now the object is no longer accessible
$x | ForEach {
$_
}
所以我的目标是以格式良好的方式查看结果,同时保持变量中的值可访问。我曾尝试制作变量的副本,一个用于查看结果,另一个用于处理变量中的值,但同样的事情。
有人对此有什么好的想法吗?谢谢!
更好的例子:
[array]$recs= Invoke-Sqlcmd -ServerInstance $server `
-Database $db `
-InputFile 'c:\sqlquery.sql'
$arrRecs = @()
ForEach ($record in $recs) {
$newObjectRecs = New-Object PSCustomObject -Property @{
"todaysDate" = $_.TodaysDate
"cats" = $record.cats
"dogs" = $record.dogs
"surname" = $record.surname
"givenName" = $record.givenName }
$arrRecs += $newObjectRecs
}
$arrRecs | `
Select @{E={$_.cats};L="cats"},@{E={$_.dogs};L="dogs"},@{E={$_.TodaysDate};L="Date"},surname,givenName | `
Format-Table -AutoSize
$arrRecs | ForEach {
$_
Write-Host "---------"
}
$arrRecs
作为对前面评论的更新,如果我在尝试显示到屏幕时遍历下面的 ForEach 语句,它不会显示管道中的当前项目,但是当它到达数组的末尾时,它显示数组中的所有项目。
如果我注释掉 Format-Table -Autosize,它会按预期显示管道中的当前项目。
【问题讨论】:
-
您希望
$x在第一行之后出现什么?原始对象,还是该管道中select-object的结果? -
在第一行中,我期待 $x 的格式化视图。尝试更改/缩短标签以适应窗口的宽度。然后我想继续访问 $x。
-
所以您期望
$x保持不变,而它正在改变?我想我从来没有见过这样的事情。你能展示更多的脚本吗? -
因此,仔细查看 ForEach 语句后,它没有显示管道中的当前项目,这让我相信它不再可访问。在循环的最后一次迭代中,它将数组中的每个项目转储到显示器上。一旦我没有看到当前项目,我就一直在停止它。如果我注释掉 FT -Autosize,它会循环显示管道中的每个项目。
-
在您更新的示例中,
$arrRecs仅被循环的 last 迭代填充,因为$arrRecs += $newObjectRecs在foreach循环之外。您还有一个语法错误,该行之后的关闭}没有对应的{。在你的真实脚本中也是这样,还是只有你的例子被破坏了?
标签: powershell