使用变量运行循环时出现问题
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 调试器时出现“事件循环已在运行”