0

我有一个带有以下摘录的 PowerShell 脚本:

foreach ($pc in $ComputerName) {
  $appnames = $appnames | Sort-Object
  Write-Debug "Number of entries in `$appnames = $($appnames.count)"
  if ($AsHTML) {#Switch Parameter
    Write-Verbose "Generating HTML Report..."
    $th = "<TR><TH>Application Name</TH>" #Create Top header
    foreach ($pc in $ComputerName) {
       $th += "<TH>$pc</TH>" #Another header for each pc
    }
    $th += "</TR>" #Header finished
    $rows = ""
    foreach ($app in $appnames) {
      $rows += "<TR><TH>$app</TH>"
      foreach ($pc in $ComputerName) {
        Write-Debug $RegistryEntries[$pc].Value[$app]
        $currentApp = $RegistryEntries[$pc].Value[$app]
        if ($currentApp) {
          if ($currentApp.DisplayVersion) {
            $status = $currentApp.DisplayVersion
          } else {
            $status = "Version-nr. N/A"
          }
        } else {
          $status = "Application N/A"
        }
        $rows += "<TD>$status</TD>" #Intersection cell for each pc
      }
      $rows += "</TR>"
    }
    Write-Verbose "Finishing html report..."
    $html = "
    <html>
      <head>
        <style>
          body { background-color:#FFFFCC;
          font-family:Tahoma;
          font-size:12pt; }
          td, th { border:1px solid #000033;
          border-collapse:collapse; }
          th { color:white;
            background-color:#000033; }
          table, tr, td, th { padding: 0px; margin: 0px }
          table { margin-left:10px; }
        </style>
        <Title>Application versions Report</Title>
      </head>
      <body>
        <table>
          $th
          $rows
        </table>
      </body>
    </html>"
  }
}

所以,稍微解释一下上面的文字墙;

  • $RegistryEntries 是哈希表的哈希表,顶级键是计算机名称,低级哈希表键是注册表卸载部分中的应用程序名称。Application-name-keys 的对应值是具有三个通用属性的自定义 PSObject:.Displayname、.DisplayVersion 和 .UninstallString。(并非所有对象都具有这三个属性,但每个对象至少具有一个)。
  • 我希望用这个 HTML 表实现的是获得某种“数据透视表”(参考 Wikipedia entry for Pivot Tables,但不完全),我可以在其中获得 Y 轴上的应用程序名称和计算机名称在 X 轴上,以及在它们相交的所述计算机上的所述应用程序的版本号。

因此,再次考虑到这一点,有人可以帮助我理解为什么我的脚本在运行时会在 shell 中提示我允许将应用程序名称添加到数组 $appnames(脚本中的其他位置),以及对 HTML 执行相同操作被放入 $rows 的输入?

另一件事有点偏题(甚至可能是题外话),我的 $RegistryEntries 对象,哈希表的哈希表,由于某种原因无法以我在以下两行中的方式访问:

Write-Debug $RegistryEntries[$pc].Value[$app]
$currentApp = $RegistryEntries[$pc].Value[$app]

谁能告诉我为什么?

总结/TL; DR:

  1. 为什么我的函数在尝试将项目添加到脚本内创建的数组时提示我允许在 shell 中执行此操作?

  2. 使用我上面描述的自定义对象保存我想要在我的 HTML 表中显示的数据,我在上面的代码摘录中尝试访问它时做错了什么?

PS:该脚本的工作原理是,如果我坐在 shell 中的所有提示中,一直按 A + Return,我将获得我想要的那种 HTML 表格,但是应用程序所在的所有单元格名称间隙计算机名称将显示“应用程序不适用”。

4

1 回答 1

2

我猜你有你的$DebugPreference和/或VerbosePreference设置为Inquire每次都会提示Write-DebugWrite-Verbose分别被调用:

Confirm
Continue with this operation?
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"):

您可能希望将它们设置为Continue。另一个来源可能是-Debug开关。

关于您的第二个问题,解释起来有点长,但是对于命令的参数,您必须将这些表达式放在括号中:

Write-Debug ($RegistryEntries[$pc].Value[$app])
$currentApp = $RegistryEntries[$pc].Value[$app]
于 2012-07-05T13:55:23.313 回答