使用变量运行循环时出现问题

Posted

技术标签:

【中文标题】使用变量运行循环时出现问题【英文标题】: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) 【参考方案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 

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

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

另请注意:

    使用Select-Object -ExpandProperty 将只返回文件的电子邮件地址。 在Get-Content 的结果上展开.Trim() 方法,而不是通过ForEach-Object 循环运行它。 利用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 进行重写

【讨论】:

以上是关于使用变量运行循环时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

使用循环运行后台获取时出现 NSInternalInconsistencyException

在使用 matplotlib 和 PySide2 运行的应用程序中使用 pdb 调试器时出现“事件循环已在运行”

循环运行时出现 Java 逻辑错误:If/else 计数器计数不正确

从 for 循环打印时出现问题

在循环中检索索引时出现问题

在指向向量的智能指针上使用 push_back() 时出现运行时错误