【问题标题】:Powershell: Format-Table -Autosize loses the variable valuesPowershell:Format-Table -Autosize 丢失变量值
【发布时间】: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 += $newObjectRecsforeach 循环之外。您还有一个语法错误,该行之后的关闭} 没有对应的{。在你的真实脚本中也是这样,还是只有你的例子被破坏了?

标签: powershell


【解决方案1】:

作为一种 hack-around(是的,我编了一个连字符的词,但我喜欢它,所以你必须忍受它)你可以尝试通过 ForEach$x 并创建一个自定义对象$x 中的每条记录。比如:

$x | %{[PSCustomObject][Ordered]@{
        "Action"=$_.AID
        "SSN"=$_.ID
        "Taco"=$_.FishBeefOrChicken
        "More"=$_.OtherProperties
    }}| FT -Auto

虽然您显示的脚本根本不应该改变 $x,并且 $x 应该是完整的并且之后可以访问,但有时解决问题所需要的只是一个新的视角和一种不同的做事方法来找到正在逃避我们的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2023-03-21
    • 2019-04-30
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多