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 に対応する値は、.Displayname、.DisplayVersion、および .UninstallString の 3 つの一般的なプロパティを持つカスタム PSObject です。(すべてのオブジェクトが 3 つのプロパティのすべてを持っているわけではありませんが、各オブジェクトには少なくとも 1 つのプロパティがあります)。
  • この HTML テーブルで達成したいことは、Y 軸のアプリケーション名とコンピューター名を取得できる、ある種の「ピボットテーブル」 (ピボットテーブルのウィキペディアのエントリを参照してください) を取得することです。 X 軸上、およびそれらが交差するコンピュータ上のアプリケーションのバージョン番号。

繰り返しますが、それを念頭に置いて、スクリプトを実行するとシェルでアプリケーション名を配列 $appnames (スクリプトの他の場所) に追加する許可を求めるプロンプトが表示され、HTML で同じことを行う理由を誰かが理解するのを手伝ってくれませんか? $rows に入れられている入力?

もう 1 つのちょっとした (トピックとは関係ないかもしれませんが)、私の $RegistryEntries オブジェクト、ハッシュテーブルのハッシュテーブルは、何らかの理由で、次の 2 行で行う方法ではアクセスできません。

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

誰かが理由を教えてくれますか?

要約/TL;DR:

  1. スクリプト内で作成された配列に項目を追加しようとすると、シェルでこれを行う許可を求められるのはなぜですか?

  2. 上記のカスタム オブジェクトが HTML テーブルに表示したいデータを保持している場合、上記のコードの抜粋でそれにアクセスしようとすると、何が間違っているのでしょうか?

PS: このスクリプトは、シェルで表示されるすべてのプロンプトにずっと座って A + Return を押し続けると、必要な種類の HTML テーブルが表示されるという意味で機能します。 name は、コンピュータ名の隙間に「Application N/A」と表示されます。

4

1 に答える 1

2

毎回プロンプトを表示するか、呼び出されるかをそれぞれ$DebugPreferenceand/orVerbosePreferenceに設定していると思います。InquireWrite-DebugWrite-Verbose

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

Continueおそらく代わりにそれらを設定したいと思うでしょう。別の原因はスイッチである可能性があります-Debug

2 番目の質問については、説明が少し長くなりますが、コマンドの引数については、そのような式を括弧で囲む必要があります。

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