2014-06-25 92 views
0

我正在使用Powershell中的treeviews - 每個建築物都有不同的節點。在我的代碼中,我抓取變量,將它們連接在一起,並將其用作變量名稱 - 但我的代碼將變量看作字符串,而不是已存在的節點的名稱...所以我得到將字符串連接到Powershell變量名稱

您無法在空值表達式上調用方法。

我該怎麼做?這可以幫助我避免在每個建築物的每個樓層都進行硬編碼。這裏是我的代碼如下所示:

$bldg = "SG1-1" //for example 
function refreshPrinterList ($bldg) 
{ 
$bldg1 = $bldg.substring(0,3) 
$floor = $bldg.substring(4,1) 
$refreshNode = -join('$TreeNode_',$bldg1,'_',$floor) 
$refreshNode.gettype() //Returns System.String` 
if($bldg1 -eq "SG1") { 
    if($floor -eq "1") { 
     $count = $refreshNode.Nodes.Count 
     while($refreshNode.Nodes.Count -gt 0) 
     { 
      $refreshNode.Nodes.RemoveAt($count) 
      $count--  
     } 

回答

1

的-join操作是字符串,盡職盡責地爲您提供了一回,而不是你想要一個樹節點的。如果你傳遞一個字符串($ bldg看起來像你的例子中的一個字符串),那麼你可以做所有你想要的字符串操作,但是該函數中沒有TreeNode對象來分配一個名字。所以,我們需要製作一個你的函數可以使用的TreeNode。那樣的事情呢?

$newNodeName = -join('$TreeNode_',$bldg1,'_',$floor) 
$refreshNode = New-Object System.Windows.Forms.TreeNode($newNodeName) 
// do stuff with $refreshNode as it is a TreeNode object like you expect 

這個$ refreshNode在它裏面沒有節點,因爲我們只是拼湊了它。由於它看起來像要修改現有的TreeNode對象,所以傳入$ refreshNode作爲參數,然後使用$ newNodeName修改其友好描述。

+0

好吧,現在我有一個正確名稱的節點,但正如您所指出的,它是一個新節點,您是對的 - 我試圖修改現有節點。也許這不是什麼大不了的事情,我可以將這個新節點添加到現有樹中並替換現有節點。我會給它一個鏡頭。 – BigfootNick

+0

所以我創建了節點,給它起了同樣的名字,並且能夠將它添加到我的treelist中,但是當我這樣做時,它會出現故障(1st Floor,2nd Floor,1st Floor),因爲它會將刷新的節點添加到列表的底部,所以我回來試圖刪除樓層節點下的所有東西 - 而不是重新創建floor節點。有沒有辦法接受我連接的字符串,並用它來指向現有TreeNode對象的名稱? – BigfootNick

+0

您可以將一個TreeNodeCollection實例化爲一個對象,然後使用它的Find方法找到您想要修改的一個。您需要按照以下網址使用New-Object cmdlet:http://technet.microsoft.com/zh-cn/library/dd347574.aspx創建:http://msdn.microsoft.com/zh-cn/庫/ system.windows.forms.treenodecollection.find(v = vs.110)的.aspx –

0

我指出了正確的方向上對在TechNet社會論壇

My question on Technet

答案是使用「獲取變量」 我有兩個變量$ bldg1和$地板,我加入到的字符串:

$newNodeName = -join('TreeNode_',$bldg1,'_',$floor) 

,然後我通過了使用「獲取變量」 - 但我不得不把變量名括號內,像這樣:

$refreshNode = (Get-Variable ($newNodeName)).Value 

現在,不是返回一個字符串類型,而是返回我現有的字符串!