私は Powershell にかなり慣れていないので、コードの並列実行にほとんど問題はありません。私の現在のコードは順番に動作しますが、これまでのところ、並列に実行しようとする試みはすべて失敗しました。これが私がやろうとしていることです:
必要なすべての情報を収集するために、複数のドメイン コントローラーにクエリを実行する必要があります (Quest コマンドレットから get-qaduser などを使用します)。現在、1 つのドメイン コントローラから別のドメイン コントローラに接続しているため、スクリプトの実行に時間がかかります。私の考えは、PS 3.0 の新しいワークフロー機能を使用することでしたが、結果をファイルにエクスポートすることは明らかに許可されていません。
作業スクリプト (順番に):
Add-PSSnapin Quest.ActiveRoles.ADManagement
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0 > OutputFile.csv
get-QADUser -Service 'domaincontroller2:389' -SizeLimit 0 > OutputFile2.csv
and so on
これが私がこれまでに試したことです:
Just an excerpt - there are more get-qaduser and domains in the real script
Workflow Get-Domainaccounts{
Parallel{
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0
}
}
しかし、実行中に次のエラーメッセージが表示されます:
Microsoft.PowerShell.Utility\Write-Error : The term 'get-QADUser' is not
recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify
that the path is correct and try again.
そこで、ワークフローにスニペットを追加することを考えました。
Workflow Get-Domainaccounts{
inlinescript {Add-PSSnapin Quest.ActiveRoles.ADManagement}
Parallel{
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0
}
}
それらを追加するだけでは機能しません。inlinescript コマンドを使用しても、get-QADUser が実行されるスレッドに渡されません。また、プロファイルからスナップインを追加しようとしましたが、ワークフローはそれを無視します。
Technet で、組み込みのコマンドレットでは実際に機能するが、Quest ツールでは機能しないこの関数を見つけました。ForEach-Parallel.ps1 関数はクリーンな実行空間を使用します (ワークフローもそうすると思います)。
これを実行しようとした方法は次のとおりです。
the hosts.txt contains:
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0 > OutputFile.csv
get-content .\hosts.txt | ForEach-Parallel -ScriptBlock {
$_ | invoke-expression
}
しかし、出力が得られません-エラーメッセージも何もありません。| なしでコードを実行する invoke-expression が機能し、ファイルの内容が表示されます。私は何を間違っていますか?
私がやりたいことは、Quest コマンドレットを並行して実行することだけです。どんな助けでも大歓迎です!