【发布时间】:2011-06-20 23:12:21
【问题描述】:
我有一个电子邮件地址和部门的 CSV,需要在 Live@edu 上设置。我目前拥有的命令如下所示:
Import-CSV departments.csv | ForEach-Object { Set-User $_.EmailAddress $_.Department }`
问题是,这个操作需要永远。
我的第一个想法是,将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.PowershellConfigurationName。
更新 2:Set-User cmdlet 似乎是 Microsoft 为 Live@edu 管理提供的。其目的是设置用户属性。它不是我能够调试的脚本或 cmdlet。不幸的是,它不需要管道输入,因此无法解决问题。
据我所知,问题在于,每次运行此命令时,它都必须构造和拆除通往远程机器的管道,而不是能够重用它。远程 ForEach 想法将允许我卸载该循环以避免必须创建所有这些远程管道,而 -asJob 将允许它们全部并行运行。但是,它也导致错误以静默方式失败,并且只有少数记录真正得到正确更新。
我怀疑此时我将无法加快此命令的速度,但必须尽我所能通过更好地跟踪我的内容来限制在特定运行中需要更改的数据量以前做过(保留差异快照)。让工作变得更加困难。
编辑:Start-Automate 留下了非常有用的帮助,不幸的是,它们都不起作用。在这一点上,我的感觉是,在我的提供商允许访问更多的 powershell cmdlet,或者修改交换 cmdlet 以允许多个管道之前,我不会找到一种方法来加快速度,我预计这两种情况都不会很快发生.我将他的答案标记为正确,尽管最终结果没有任何显着帮助。谢谢,开始自动化。
【问题讨论】:
-
如果您能更详细地说明什么是“永远”,那将会有所帮助。
Set-User做什么?如果它不产生任何输出,则很难判断其滞后于何处。我会添加几个Write-Debug以获得更好的视图。
标签: powershell foreach exchange-server powershell-remoting