我有一个CSV电子邮件地址和部门,我需要在Live @ edu上设置。我目前的命令看起来像这样:
Import-CSV departments.csv | ForEach-Object { Set-User $_.EmailAddress $_.Department }`
问题是,此操作需要FOREVER。
我的第一个想法是,将ForEach-Object
命令实际转发到远程机器会很棒,这样它只需要在两台机器之间创建一个管道,但是当我走的时候进入PSSession,似乎没有任何foreach-object
可用。作为参考,我如何导入PSSession是:
Import-PSSession(New-PSSession -ConfigurationName Microsoft.Exchange `
-ConnectionUri 'https://ps.outlook.com/powershell' `
-Credential (Get-Credential) `
-Authentication Basic -AllowRedirection)
有没有更好的方法可以导入会话以允许ForEach-Object远程,或者导入远程foreach-object的别名版本,可能是ForEach-Object-Remote,或者也许有人有东西最好建议简化这个过程吗?
更新: 我尝试了几件事:
在隐式远程命令上使用-AsJob
开关。
Import-CSV departments.csv | ForEach-Object { Set-User $_.EmailAddress $_.Department -AsJob }
遗憾的是,这不起作用,因为存在不允许附加连接的限制限制。更糟糕的是,在检查结果之前,我甚至都不知道出现了什么问题,并且发现其中很少有人真的被改变了。
以不同的名称导入ForEach-Object
。
事实证明,添加前缀很简单,因为在-Prefix RS
命令中放置Import-PSSession
可以使远程会话中的ForEach-Object之类的内容在本地会话中变为ForEach-RSObject
。不幸的是,这对我不起作用,因为我连接的服务器没有Microsoft.Powershell
ConfigurationName可供我使用。
更新2:Set-User cmdlet似乎是Microsoft为Live @ edu管理提供的。其目的是设置用户属性。它不是我能够调试的脚本或cmdlet。遗憾的是,它没有采取管道输入,因此无法解决问题。
据我所知,问题是它必须在每次运行此命令时构建并拆除到远程机器的管道,而不是能够重用它。远程ForEach的想法将允许我卸载该循环以避免必须创建所有这些远程管道,而-asJob将允许它们全部并行运行。但是,它也导致错误无声地失败,只有少数记录实际上得到了适当的更新。
我怀疑在这一点上我将无法加速这个命令,但我必须尽我所能通过更好地跟踪我的内容来限制特定运行中需要更改的数据量以前做过(保持差异快照)。使工作变得更加困难。
编辑: Start-Automate 留下了非常有用的帮助,遗憾的是,它们都不起作用。我觉得在这一点上我找不到一种方法来加快速度,直到我的提供者访问更多的PowerShell cmdlet,或者修改了交换cmdlet以允许多个管道,我预计这些管道都不会很快发生。我认为他的答案是正确的,尽管最终的结果是没有任何帮助。谢谢,开始自动化。
答案 0 :(得分:1)
您可以通过使用foreach语句而不是Foreach-Object来避免尝试与服务器建立两个连接,从而加快脚本速度。
$departments = @(import-csv .\departments.csv)
foreach ($user in $departments) {
Set-User $user.EmailAddress $user.Department
}
如果您需要批处理,可以使用for语句,在每批中继续前进
for ($i =0; $i -lt $departments.Count; $i+=3) {
$jobs = @()
$jobs+= Invoke-Command { Set-User $departments[$i].EmailAddress $departments[$i].Department } -AsJob
$jobs+= Invoke-Command { Set-User $departments[$i + 1].EmailAddress $departments[$i + 1].Department } -AsJob
$jobs+= Invoke-Command { Set-User $departments[$i + 2].EmailAddress $departments[$i + 2].Department } -AsJob
$jobs | Wait-job | Receive-job
}
希望这有帮助