2

我有一个我需要在 Live@edu 上设置的电子邮件地址和部门的 CSV。我目前拥有的命令如下所示:

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,或者是否有人有更好的建议简化这个过程?

更新:我尝试过的几件事:

  1. 使用-AsJob隐式远程命令上的开关。

    Import-CSV departments.csv | ForEach-Object { Set-User $_.EmailAddress $_.Department -AsJob }
    

    不幸的是,这不起作用,因为存在不允许额外连接的限制。更糟糕的是,我什至不知道出了什么问题,直到我检查了结果,发现其中很少有人真正改变了。

  2. ForEach-Object以不同的名称导入。

    事实证明,添加前缀很容易,就像-Prefix RSImport-PSSession命令中放入远程会话中的 ForEach-Object 之类的东西一样成为ForEach-RSObject本地会话。不幸的是,这对我不起作用,因为我要连接的服务器没有Microsoft.Powershell可用的 ConfigurationName。

更新 2:Set-User cmdlet 似乎是 Microsoft 为 Live@edu 管理提供的。其目的是设置用户属性。它不是我能够调试的脚本或 cmdlet。不幸的是,它不需要管道输入,因此无法解决问题。

据我所知,问题在于每次运行此命令时它都必须构造和拆除通往远程机器的管道,而不是能够重用它。远程 ForEach 想法将允许我卸载该循环以避免必须创建所有这些远程管道,而 -asJob 将允许它们全部并行运行。但是,它也会导致错误以静默方式失败,并且实际上只有少数记录得到正确更新。

我怀疑此时我将无法加快此命令的速度,但必须尽我所能通过更好地跟踪我之前所做的事情来限制在特定运行中需要更改的数据量(保持差异快照)。让工作有点难。

编辑:Start-Automate留下了非常有用的帮助,不幸的是,它们都不起作用。在这一点上,我的感觉是,在我的提供商允许访问更多的 powershell cmdlet,或者修改交换 cmdlet 以允许多个管道之前,我不会找到一种方法来加快速度,我预计这两种情况都不会很快发生. 我将他的答案标记为正确,尽管最终结果没有任何帮助。谢谢,开始自动化

4

1 回答 1

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
}

希望这可以帮助

于 2011-06-21T20:40:54.640 回答