2

Live@edu で設定する必要がある電子メール アドレスと部門の CSV があります。私が現在持っているコマンドは次のようになります。

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

問題は、この操作に永遠にかかることです。

私が最初に考えたのは、ForEach-Objectコマンドを実際にリモート マシンに転送して、2 台のマシン間に 1 つのパイプラインを作成するだけで済むようにすればよいということですが、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-Remote としてリモート foreach-object のエイリアス バージョンをインポートするより良い方法はありますか?このプロセスを合理化するには?

更新:私が試したいくつかのこと:

  1. -AsJob暗黙的にリモート化されたコマンドでスイッチを使用します。

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

    残念ながら、追加の接続を許可しないスロットリング制限があるため、これは機能しません。さらに悪いことに、結果を確認して実際に変更されたものはほとんどないことがわかるまで、何かが間違っていたことさえ知りません。

  2. ForEach-Objectを別の名前でインポートします。

    リモート セッションからの ForEach-Object などをローカル セッション-Prefix RSにするコマンドを入力するだけで、プレフィックスを追加するのは簡単であることがわかります。残念ながら、これはうまくいきません。接続先のサーバーにConfigurationName が用意されていないからです。Import-PSSessionForEach-RSObjectMicrosoft.Powershell

更新 2: Set-User コマンドレットは、Microsoft が Live@edu 管理用に提供しているようです。その目的は、ユーザー属性を設定することです。これは、デバッグできるスクリプトまたはコマンドレットではありません。残念ながら、パイプライン入力を必要としないため、問題を修正することはできません。

私が知る限り、問題は、このコマンドを実行するたびに、リモート マシンへのパイプラインを再利用するのではなく、構築して破棄する必要があることです。リモート ForEach のアイデアを使用すると、そのループをオフロードして、すべてのリモート パイプラインを作成する必要がなくなりますが、-asJob を使用すると、それらをすべて並行して実行できます。ただし、エラーが黙って失敗する原因にもなり、実際に適切に更新されるレコードはごくわずかでした。

この時点で、このコマンドを高速化することはできないと思いますが、以前に行ったことをよりよく追跡することにより、特定の実行で変更する必要があるデータの量を制限するためにできる限りのことを行う必要があります(差分スナップショットを保持します)。仕事が少し難しくなります。

編集: Start-Automateは非常に便利なヘルプを残しましたが、残念ながら、どちらも機能しません。プロバイダーがより多くの PowerShell コマンドレットへのアクセスを許可するか、exchange コマンドレットが複数のパイプラインを許可するように変更されるまで、これを高速化する方法が見つからないというのが現時点での私の感覚です。 . 最終的な結果が何の役にも立たないにもかかわらず、私は彼の答えを正しいとマークしています。ありがとう、Start-Automate

4

1 に答える 1

1

Foreach-Objectの代わりにforeachステートメントを使用することで、スクリプトを高速化し、サーバーへの2つの接続を回避することもできます。

$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 に答える