2012-07-05 34 views
0

我有以下摘錄PowerShell腳本:爲什麼我的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的相應值是具有三個常規屬性的自定義PSObjects:.Displayname,.DisplayVersion和.UninstallString。 (並非所有對象都具有全部三個屬性,但每個對象至少有一個)。
  • 我希望用這個HTML表格獲得某種「樞軸表」(參考樞軸表的維基百科條目,但不完全),我可以在Y軸上獲得應用程序名稱,和X軸上的計算機名稱以及所述計算機上所述應用程序的版本號相交。

如此反覆,考慮到這一點,可能有人幫助我瞭解爲什麼我的腳本在運行時會提示我在外殼是否允許應用程序名稱添加到陣列$ appnames(其他地方的腳本),以及對正在放入$ rows的HTML輸入做同樣的事情?

另一件有點偏旁(甚至可能是脫離主題),我的$ RegistryEntries對象,哈希表的哈希表,由於某種原因不能以我在下面兩行執行的方式訪問:

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

有沒有人能告訴我爲什麼?

綜上所述/ TL; DR:

  1. 爲什麼試圖將項目添加到腳本中創建一個數組時,我的功能提示我的許可,只是這樣做的殼呢?

  2. 使用上面描述的自定義對象來保存我想要在我的HTML表格中顯示的數據,我在做什麼錯誤的嘗試訪問它在上面的代碼摘錄?

PS:腳本在這個意義上的作品,如果我坐在遍及所有提示我在shell獲得,創下A +返回的時候,我會得到我想要的那種HTML表格,但應用程序名稱會使計算機名稱間隔的所有單元格都會顯示「應用程序不適用」。

+0

這是對SilentlyContinue。我想這就是標準,我沒有觸及它。 – x10an14 2012-07-05 13:55:23

+0

嗯,我想知道,因爲你提到了提示符,'Write-Debug'和'Write-Verbose'可以這樣做,這取決於'$ * Preference'。 – Joey 2012-07-05 13:56:24

+0

我剛剛設法在shell中重新創建了提示符,並且它發生_after_我有'DEBUG:<我用代碼寫入的文本>' AKA在下一行。 http://imgur.com/gje9R – x10an14 2012-07-05 14:27:09

回答

1

我猜你有你的$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] 
+0

我想我正在尋找的答案是被告知/發現將'-Debug'開關添加到我的cmdlet會使整個函數每次遇到Write-Debug語句時,請停下並等待我的準備!但是既然你是讓我在這裏的人,我感謝你提供答案=)。 (我確實有一個'Write-Debug'的每一個地方,我加入到一個數組中,原因很明顯,爲什麼我認爲這個數組操作是責怪^^) – x10an14 2012-07-05 18:29:09

+0

如果你不能像你一樣嘗試你的代碼,做;) – Joey 2012-07-05 18:43:22

+0

是的,當我8小時前第一次寫這個問題時,這是我第一次嘗試寫一個問題,所以我認爲你可能沒有興趣閱讀我200行的醜陋代碼^^如果我看到你身邊在以後的時間,一定要打招呼,你會得到一個pastebin鏈接! = D – x10an14 2012-07-05 19:02:44

相關問題