Powershell 2:返回值和调用者之间的数组大小不同

Lar*_*old 4 arrays string powershell function

我一直在敲打我几个小时,谷歌没有帮助.

我有一个在我的代码中调用的函数.电话看起来像这样:

$newData = @(CreateMailContactIfNeeded $entry)
Run Code Online (Sandbox Code Playgroud)

调用的函数应始终返回2元素数组.我在被调用函数的return语句之前确认了这一点:

# ... (inside CreateMailContactIfNeeded) ...
$tmpArr = @("$contactString" , "external")
Write-Host "length is" $tmpArr.length
Write-Host "Contact string is ->"$contactString"<-"
return $tmpArr
Run Code Online (Sandbox Code Playgroud)

长度始终为2,并且联系人字符串始终为非null.样本输出:

length is 2
Contact string is -> GMSContact-33<-
Run Code Online (Sandbox Code Playgroud)

(我无法剥离字符串中的前导空格,所以我假设这是某种内部PowerShell字符串格式或其他东西)

但是,当我回到调用函数时,有时候,但并非总是如此,我从返回值构建的数组是长度为3:

if ($newData.length -eq 3) {
  Write-Host "Weird - array length is 3..."
}

Write-Host "Array length now is "$newData.length
foreach ($tmpVar in $newData) {
  Write-Host "Array entry is "$tmpVar
}
Run Code Online (Sandbox Code Playgroud)

3条目数组的第一个元素是有效字符串,但它是早期处理的工件:

Weird - array length is 3...
Array length now is  3
Array entry is  Test User       <-- INVALID
Array entry is  GMSContact-33   <-- This should be first element
Array entry is  external        <-- This should be second element
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释可能发生的事情以及如何解决这个问题吗?我不正确地进行数组分配吗?鉴于上面的代码,"测试用户"如何插入阵列?

编辑:下面的CreateMailContactIfNeeded的完整内容...

function CreateMailContactIfNeeded {
  param($CSVEntry)

  $email = $CSVEntry.EMAIL_ADDR

  Write-Host    "--> Searching for $email"
  Write-Host -n "----> In AD? "
   # Return if this person already exists as a user in AD
  if (IsInOurADDomain $CSVentry) {
    Write-Host -f green "YES."
    Write-Host "Returning "$email "= inhouse"
    return @("$email" , "inhouse")
  } else {
    Write-Host -n -f gray "NO. "
  }

  $contactString = "GMSContact-" + $CSVEntry.MEMBER_ID
  Write-Host "Contact string is now " $contactString

  # Check if mail contact already exists. If not, create it.
  Write-Host -n "In Contacts? "
  $object = Get-MailContact $email 2> $null

  if ($object -eq $null) {
    $displayName = $CSVentry.FIRST_NAME + " " + $CSVentry.LAST_NAME

    Write-Host -n -f gray "NO. "
    Write-Host -n "Creating contact... "

    $error.clear()
    New-MailContact -Name $contactString                    `
                    -DisplayName $displayName               `
                    -ExternalEmailAddress $email            `
                    -OrganizationalUnit $global:OU_CONTACT_STRING  
    if ($error[0] -ne $null) {
      Write-Host -f red "ERROR"
      Write-Error $error[0]
      return @("error","error")
    }
    # Derek says to do this to make it appear in alternate address book
    Set-MailContact -identity $contactString -customattribute1 "AB2"
    Write-Host -f green "SUCCESSFUL"
  } else {
    Write-Host -f green "YES"
  }
  Write-Host "Returning" $contactString "= external"
  $tmpArr = @("$contactString" , "external")
  Write-Host "length is" $tmpArr.length
  Write-Host "Contact string is ->"$contactString"<-"
  Write-Host "Contact string length is "$contactString.length
   foreach ($tmp in $tmpArr) {
     Write-Host "In function element is "$tmp
   }
   return $tmpArr
#  return @("$contactString" , "external")
}
Run Code Online (Sandbox Code Playgroud)

man*_*lds 6

在Poweshell中,任何未被"捕获"的东西都被有效地"返回".

我们来举个例子:

function test(){

    "starting processing"

    #do some processing

    write-host "starting different process"
    $output = @("first",second")
    return $output
}
Run Code Online (Sandbox Code Playgroud)

当你做类似的事情时$myoutput =test,你会看到$ myoutput实际上有三个元素 - first,second正如预期的那样starting processing.因为它没有starting processing被捕获并被"返回"管道.

只要在脚本中生成无效的"TEST USER"输出,请尝试捕获输出Out-Null或将其传递给或分配给它$null


很容易找出额外元素被"返回"的位置.

更改脚本,以便不以可变的方式捕获函数的输出.所以保持原样CreateMailContactIfNeeded $entry

在运行脚本之前,请运行Set-PsDebug -trace 1.现在,运行脚本 - 您应该能够看到TEST USER返回的位置.按照上面的建议捕获它.