PowerShell函数返回值我不需要的其他值

时间:2016-01-29 16:22:59

标签: function powershell

当我查询AD时,返回一个SIP地址。这不是问题。字符串完美地回来了。但我会不断使用这段代码,所以我需要编写一个函数。该函数返回我需要的内容,但它也返回了我不需要的其他内容。

我所做的只是查询AD并获取SIP地址。如:John.Smith@ourbusiness.com。我在" @"分拆电子邮件地址。符号并返回它左边的内容。再次,代码完美地返回John.Smith。

但是当我在函数中添加此代码时,我得到的回报看起来像这样。

0
1
2
John.Smith

这就是我所拥有的。

Function CheckSIP {

    $loggedOnUser = (get-WmiObject win32_process -Filter "Name='explorer.exe'"|Select -First 1).GetOwner().User

    $strFilter = "(&(objectCategory=User)(mailnickname=$loggedOnUser))"
    $objDomain = New-Object 

    System.DirectoryServices.DirectoryEntry("LDAP://OU=Offices,dc=OurNetwork,dc=net")
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.PageSize = 1000
    $objSearcher.Filter = $strFilter
    $objSearcher.SearchScope = "Subtree"

    $colProplist = "name", "mail", "mailnickname"
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

    $colResults = $objSearcher.FindAll()

    foreach ($objResult in $colResults){

        $objItem = $objResult.Properties
        [string]$UserName = $objItem.name 
        [string]$sipaddress = $objItem.mail
        [string]$mailnickname = $objItem.mailnickname
    }

    $theSIP = $sipaddress.Split("@")[0]

    return $theSIP
}

$mySIPaddress = CheckSip

我所需要的只是john.smith

我确定我的语法障碍在哪里,我只是不知道在哪里看。

1 个答案:

答案 0 :(得分:2)

在PowerShell中,不仅是函数的return语句创建输出:

  • 函数中的任何语句都可以写入输出流。
  • 此外,任何产生输出默认情况的语句都会写入输出流,除非该输出是在变量中捕获的或被抑制的(通过>$null / | Out-Null或通过$null = ...

在您的情况下,它是以下语句(返回$i插入StringCollection)实例的索引:

$objSearcher.PropertiesToLoad.Add($i)

简单地取消输出会从输出中删除012值:

$null = $objSearcher.PropertiesToLoad.Add($i)

另外,您可以简化代码:

  • 使用$env:USERNAME代替(get-WmiObject win32_process -Filter "Name='explorer.exe'"|Select -First 1).GetOwner().User
  • ActiveDirectory PowerShell module与其Get-ADUser cmdlet一起使用,这样可以更轻松地使用AD。