【发布时间】:2011-11-11 15:48:18
【问题描述】:
我已经为此苦苦思索了几个小时,但谷歌没有任何帮助。
我有一个在我的代码中调用的函数。调用如下所示:
$newData = @(CreateMailContactIfNeeded $entry)
被调用的函数应该总是返回一个 2 元素数组。我确认这一点 在被调用函数的 return 语句之前:
# ... (inside CreateMailContactIfNeeded) ...
$tmpArr = @("$contactString" , "external")
Write-Host "length is" $tmpArr.length
Write-Host "Contact string is ->"$contactString"<-"
return $tmpArr
长度始终为 2,联系人字符串始终为非空。示例输出:
length is 2
Contact string is -> GMSContact-33<-
(我无法去除字符串中的前导空格,所以我认为这是某种 内部powershell字符串格式或其他东西)
但是,当我回到调用函数时,有时但并非总是如此 我从返回值构建的数组是长度三个:
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
}
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
有人可以向我解释可能发生的情况以及如何解决吗?我做的数组分配不正确吗?鉴于上面的代码,“测试用户”怎么可能被插入到数组中?
编辑:下面 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")
}
【问题讨论】:
-
请发布您的其余代码。我确定它在你的函数中。
-
@JNK:完成。完整的功能内容现在出现在帖子的底部。谢谢。
-
除了一些尴尬的字符串操作,它看起来还不错。是输出问题还是您分配给输出的变量有问题?如果你只是直接从函数输出
$tmpvar可以吗?我还强烈建议您为此类内容输入变量。 -
@JNK - 函数中的所有内容,在返回之前,看起来都很完美。问题是在函数内部,数组是完美的。长度为二,它包含我想要的内容。一旦它返回该数组,并且该返回值被分配给一个新参数,该新参数有时就是一个长度为 3 的数组,其中第一个元素是虚假的和不受欢迎的。我不知道是什么原因造成的。我是PS新手。你能推荐干净清晰地为任何数组设置类型的最佳方法吗?我是否正确返回数组值并正确分配?谢谢!
标签: arrays string function powershell