【问题标题】:Trouble running loop with variable使用变量运行循环时出现问题
【发布时间】:2021-11-05 10:40:58
【问题描述】:

我正在编写一个脚本来提取用户列表,然后将该用户邮箱和存档列表归档到 psts 中

$Lines = Get-ADUser -Filter * -Properties EmailAddress
$Lines | select EmailAddress | Where {$_.EmailAddress -ne $null} | Out-File "C:\T2\EMailAddresses.txt"

(Get-Content "C:\T2\EMailAddresses.txt") | ForEach { $_.Trim() } | Set-Content "C:\T2\EMailAddresses.txt"

$Names = Get-Content "C:\T2\EMailAddresses.txt"
$Emails = $Names.Split("@")[0]
Add-PSSnapIn -Name Microsoft.Exchange, Microsoft.Windows.AD

$SubPath1 = "\\qnap1\archive\exchange_Migration\"
$SubPath2 = "_Primary_mailbox.pst"
$SubPath3 = "_Archive_mailbox.pst"

ForEach ($Email in $Emails) { New-MailboxExportRequest -Mailbox $Email -FilePath "$Subpath1 + $Email.Split("@")[0] + $SubPath2" ; New-MailboxExportRequest -Mailbox $Email.Split("@")[0] -FilePath "$Subpath1 + $Email + $SubPath3" -IsArchive }

我正在努力使变量正确。我想在导出请求命令中使用完整的电子邮件地址,但在导出路径中只使用电子邮件的名称部分(不是域)

【问题讨论】:

  • 将"$Subpath1 + $Email.Split("@")[0] + $SubPath2" 更改为($Subpath1 + $Email.Split("@")[0] + $SubPath2)

标签: powershell exchange-server


【解决方案1】:

我认为发生了一些事情。当您在$Names 数组上展开.Split("@") 时,您将使用[0] 对其进行索引。这将返回由拆分产生的数组的第一个元素。不是每个拆分产生的第一个元素...

但无论如何都不需要这样做。您可以简单地通过几种方式,例如:

Add-PSSnapIn -Name Microsoft.Exchange, Microsoft.Windows.AD

$Lines = Get-ADUser -Filter "EmailAddress -like '*'" -Properties EmailAddress
$Lines | 
Select-Object -ExpandProperty EmailAddress | 
Out-File "C:\T2\EMailAddresses.txt"

(Get-Content "C:\T2\EMailAddresses.txt").Trim() | 
Set-Content "C:\T2\EMailAddresses.txt"

$Emails = Get-Content "C:\T2\EMailAddresses.txt"

$SubPath1 = "\\qnap1\archive\exchange_Migration\"
$SubPath2 = "_Primary_mailbox.pst"
$SubPath3 = "_Archive_mailbox.pst"

ForEach ($Email in $Emails)
{
    $Alias = $Email.Split("@")[0]
    $FilePathPrimary = "$Subpath1" + $Alias + $SubPath2
    $FilePathArchive = "$Subpath1" + $Alias + $SubPath3

    New-MailboxExportRequest -Mailbox $Email -FilePath $FilePathPrimary
    New-MailboxExportRequest -Mailbox $Email -FilePath $FilePathArchive -IsArchive 
}

注意:我显然无法测试这个。

您可以直接使用电子邮件,然后在每次循环迭代中简单地计算导出命令的参数。这样更清晰,更易于阅读。

另请注意:

  1. 使用Select-Object -ExpandProperty 将只返回文件的电子邮件地址。
  2. 在Get-Content 的结果上展开.Trim() 方法,而不是通过ForEach-Object 循环运行它。
  3. 利用Get-ADUser 的-Filter 参数将筛选条件留在命令/管道中,这是一种性能最佳实践。特别是当命令有自己的和/或足够的过滤功能时。

旁白:

还有其他一些事情可以简化。但是,到目前为止,这种呈现方式实际上不需要将数据与文件进行中间处理。因此,我将跳过在该领域进行增强。相反,您可以从Get-ADUser 获取输出并直接使用它。同样,有很多方法可以做到这一点,但在我们已有的基础上,这里有一个例子:

Add-PSSnapIn -Name Microsoft.Exchange, Microsoft.Windows.AD

$SubPath1 = "\\qnap1\archive\exchange_Migration\"
$SubPath2 = "_Primary_mailbox.pst"
$SubPath3 = "_Archive_mailbox.pst"

$Emails = (Get-ADUser -Filter "EmailAddress -like '*'" -Properties EmailAddress).EMailAddresses

ForEach($Email in $Emails)
{
    $Alias = $Email.Split("@")[0]
    $FilePathPrimary = "$Subpath1" + $Alias + $SubPath2
    $FilePathArchive = "$Subpath1" + $Alias + $SubPath3

    New-MailboxExportRequest -Mailbox $Email -FilePath $FilePathPrimary
    New-MailboxExportRequest -Mailbox $Email -FilePath $FilePathArchive -IsArchive
}

警告:

超出了问题的范围,但到目前为止的所有代码都假定邮箱确实具有启用的存档。如果不是这种情况,则尝试导出存档可能会引发一个血腥的红色错误。您可以通过引入一些错误处理来处理它。或者,您可以考虑使用 Exchange 工具中的 Get-Mailbox 而不是 Get-ADUser 进行重写

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2020-12-26
    • 1970-01-01
    • 2021-03-16
    • 2020-05-10
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多