2014-06-25 54 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 

现在,不是返回一个字符串类型,而是返回我现有的字符串!