Запустите командлет Quest параллельно и сохраните вывод в файл
Я довольно новичок в Powershell и у меня мало проблем с параллельным выполнением кода. Мой текущий код работает последовательно, но каждая попытка заставить его работать параллельно провалилась. Вот что я планирую сделать:
Мне нужно запросить несколько контроллеров домена (я использую get-qaduser и т. Д. Из командлетов Quest), чтобы собрать всю необходимую информацию. Поскольку я в настоящее время связываюсь с одним контроллером домена другим, сценарий выполняется долго. Моя идея состояла в том, чтобы использовать новую функцию Workflow в 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 параллельно. Любая помощь высоко ценится!
1 ответ
Ваша ошибка указывает на то, что модуль Quest не импортирован в сеанс рабочего процесса, попробуйте что-то вроде этого... Получите ваш сеанс рабочего процесса внутри переменной $Session
Invoke-Command -Session $Session -ScriptBlock {Import-Module <ModuleName> -Verbose}
Надеюсь, это поможет, Крис