【问题标题】:How do you pass an array full of variables into a function in PowerShell?如何将一个充满变量的数组传递给 PowerShell 中的函数?
【发布时间】:2019-12-16 22:20:42
【问题描述】:

我正在编写一个脚本,如果我可以将一个数组 ($arrUserTemplates= $Mailbox1, $Mailbox2, $Mailbox3) 传递给一个函数,它会变得更容易,但我似乎无法弄清楚。我通过使用Param($arrUserTemplates, $Mailbox1, $Mailbox2, $Mailbox3) 传递变量,但脚本似乎忽略了它并且没有传递$arrUserTemplates 内的变量。

这样可以重现问题(函数比较长,里面有开关):

$arrUserTemplates= $Mailbox1, $Mailbox2, $Mailbox3

Function CreateMailboxes{
    Param($StorePrefix, $Store, $SharedMailboxPass, $StoreEmailOU, $EcommSharedMailboxOU, $DomainController, $arrUserTemplates, $Mailbox1, $Mailbox2, $Mailbox3)
    Foreach ($MailboxUser in $arrUserTemplates){
         Write-host "arrUserTemplates: $arrUserTeamplates"
    }
}

CreateMailboxes $StorePrefix $Store $SharedMailboxPass $StoreEmailOU $EcommSharedMailboxOU $DomainController $arrUserTemplates $Mailbox1 $Mailbox2 $Mailbox3

这会简单地返回“arrUserTemplates:”三次。

我使用以下方式调用它:
CreateMailboxes $StorePrefix $Store $MailboxPass $StoreEmailOU $EcommSharedMailboxOU $DomainController $arrUserTemplates $Mailbox1 $Mailbox2 $Mailbox3

我需要它在 $arrUserTemplates 的值上通过 foreach 循环传递变量,因为我随后会使用此函数构建的所有内容(其中还包括一个开关)来运行 New-ADUser:

  New-ADUser -Name $MailboxUser -SamAccountName $MailboxUser -UserPrincipalName $UPN `
   -DisplayName $DisplayName -Description $Desc -Enabled $True `
   -AccountPassword (ConvertTo-SecureString -AsPlainText $MailboxPass -Force) `
   -ChangePasswordAtLogon $False -PasswordNeverExpires $PasswordNeverExpires -CannotChangePassword $CannotChangePassword `
   -Path $OU -Server $DomainController

【问题讨论】:

  • '这 [显示] "arrUserTemplates: " 三次。' - 这对我来说似乎是预期的。为什么它会在循环中使用 $arrUserTemplates 以外的东西?
  • 好吧,让我们从$arrUserTeamplates 开始,其中有一个额外的“a”。接下来,我想你想要的是Write-Host "arrUserTemplates: $MailboxUser"
  • $arrUserTemplates= @($Mailbox1, $Mailbox2, $Mailbox3)
  • @user2864740 大多数情况下,我这样做是为了看看会发生什么。我希望它会...实际上,由于 TheMadTechnician 指出的内容,该测试无效。
  • @TheMadTechnician 我在这个例子中打错了 $arrUserTemplates。我不得不消毒。它在我的脚本中拼写正确。我在 Write-Host 中进行了更改,并且 $MailboxUser 仍然为空

标签: arrays powershell switch-statement


【解决方案1】:

所以这里的主要问题是您在定义$arrUserTemplates 之后定义$Mailbox1$Mailbox2$Mailbox3。如果您希望能够通过更改它引用的变量的值来更改$arrUserTemplates 的值,那么这就是那里的关键......[ref] 类型。如果您首先创建变量,即使使用 $null 值,您也可以在创建数组时将它们分配为参考变量,然后当您稍后更改变量的值时,数组会反映更改而无需进一步干预。例如这段代码:

$Mailbox1,$Mailbox2,$Mailbox3 = $null
$arrUserTemplates = [ref]$Mailbox1,[ref]$Mailbox2,[ref]$Mailbox3

"arrUserTemplates initial value:"
$arrUserTemplates

$Mailbox1 = 'Mailbox1'
$Mailbox2 = 'Mailbox2'
$Mailbox3 = 'Mailbox3'

"arrUserTemplates final value:"
$arrUserTemplates

将创建此输出:

arrUserTemplates initial value:

Value   
-----   



arrUserTemplates final value:
Mailbox1
Mailbox2
Mailbox3

这表明数组中变量的值是空白的,然后在我更改变量后,数组中的值会更新以匹配。

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 2017-02-08
    • 2015-07-02
    • 2019-02-25
    • 2020-07-28
    • 2018-01-20
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多