Запустите командлет 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}

Надеюсь, это поможет, Крис

Другие вопросы по тегам