Показать полную графическую версию : [решено] Poweshell RunspacePool — Многопоток
rulesss2
03-06-2021, 16:24
Добрый день. Написал код, но не работает с RunspacePool.
$button_OK.Add_Click({
$RunspacePool = [runspacefactory]::CreateRunspacePool(1,8)
$RunspacePool.ApartmentState = "MTA"
$RunspacePool.Open()
$Work = [powershell]::Create().AddScript($scriptblock)
$scriptblock = {
if ($CheckBox_ESPP.Checked){
& C:\PSTools\psexec.exe -h -nobanner -accepteula @C:\comps.txt powershell.exe -inputformat none "Invoke-Expression -Command 'hostname'; Get-Item C:\EASOPS\ESPP\In; Get-Item C:\EASOPS\ESPP\Out"
}
if ($CheckBox_GMMQ.Checked){
& C:\PSTools\psexec.exe -h -nobanner -accepteula @C:\comps.txt powershell.exe -inputformat none "Invoke-Expression -Command 'hostname'; Get-Item C:\GMMQ\Export; Get-Item C:\GMMQ\Import"
}
if ($CheckBox_Size.Checked){
& C:\PSTools\psexec.exe -h -nobanner -accepteula @C:\comps.txt powershell.exe -inputformat none "Invoke-Expression -Command 'hostname'; Get-PSDrive C"
}
}
$Work.RunspacePool = $RunspacePool
$Work.BeginInvoke()
$RunspacePool.Close() | Out-Null
$RunspacePool.Dispose() | Out-Null
})
Подскажите, пожалуйста, что я сделал не так?
rulesss2
11-06-2021, 09:00
Столько просмотров, ни кто не знает?
ни кто не знает? »
Сформулируйте задачу, а не вопрос "почему не работает", тогда, возможно, что-то подскажут.
И код обрамляйте специальными тегами...
DJ Mogarych
11-06-2021, 09:21
Зачем с пауэршеллом использовать psexec? У него есть свои механизмы удалённого запуска.
https://docs.microsoft.com/ru-ru/powershell/scripting/learn/remoting/running-remote-commands?view=powershell-7.1
rulesss2
11-06-2021, 09:48
Суть в том, что psexec выполняет код на 51 компьютере по очереди. Через RunspacePool я пытаюсь создать выполнение кода хотя бы на 8 компьютерах одновременно.
Зачем с пауэршеллом использовать psexec? У него есть свои механизмы удалённого запуска. »
Enter-PSSession Не работает. Блокирует антивирус. Возможности управлять им нет, по этому пришлось использовать psexec.
DJ Mogarych
11-06-2021, 11:31
Возможности управлять им нет »
Договориться с теми, кто им управляет?
Invoke-command запускает сразу 32 сессии.
Enter-PSSession Не работает »
Если через psexec на удалённой машине выполнить
winrm -qc
или
powershell -command "Enable-PSRemoting -Force"
, тоже нет?
rulesss2
11-06-2021, 13:07
Все варианты пробовал. Договориться не вариант. Этот код пробовал "Служба WinRM уже настроена на прием запросов на компьютере."
Enter-PSSession : Сбой подключения к удаленному серверу xxxx. Сообщение об ошибке: Клиенту не удается подключит
ься к узлу назначения, указанному в запросе. Убедитесь, что служба на узле назначения работает и принимает запросы. Озн
акомьтесь с журналами и документацией для определения запущенной на узле назначения службы WS-Management (чаще всего эт
о IIS или WinRM). Если это служба WinRM, то для анализа состояния и настройки этой службы используйте на удаленном узле
команду "winrm quickconfig". Подробности см. в разделе справки "about_Remote_Troubleshooting".
строка:1 знак:1
+ Enter-PSSession xxxx
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (xxxx:String) [Enter-PSSession], PSRemotingTransportException
+ FullyQualifiedErrorId : CreateRemoteRunspaceFailed
Ошибка при попытки подключения.
Foreigner
11-06-2021, 13:22
rulesss2, Посмотрите в сторону workflow, который позволяет выполнять код параллельно. Или ставьте PowerShell Core, где у Foreach-Object есть -Parallel и -ThrottleLimit.
То, что вам не позволяет антивирус, это конечно сильно. Он скорее должен ругаться на psexec.
rulesss2
11-06-2021, 13:42
С workflow беда. Не получается добавить в код который написал в первом посте. Если кто-то поможет, буду очень благодарен. На psexec антивирус не ругается. Команды выполняются, просто хочу ускорить процесс выполнения.
Foreigner
11-06-2021, 13:51
Не получается добавить в код который написал в первом посте. »
Откажитесь от него, перепишите с использованием workflows.
Просто сравните время выполнения:
$list = 'ya.ru','google.com','yahoo.com'
workflow Test-Ping
{
param ([string[]] $list)
foreach -parallel ($l in $list)
{
Test-Connection $l -count 2
}
}
Test-Ping $list
rulesss2
15-06-2021, 15:14
Откажитесь от него, перепишите с использованием workflows. »
$computer = Get-Content -Path C:\comps.txt
workflow test {
param ([string[]]$computers)
foreach -parallel ($computer in $computers) {
InlineScript { C:\PSTools\psexec.exe $computer powershell.exe -inputformat none -command "Invoke-Expression -Command 'hostname'; Get-Item C:\EASOPS\ESPP\In; Get-Item C:\EASOPS\ESPP\Out"
}
}
}
Написал так, но ничего не происходит. Подскажите, пожалуйста.
Foreigner
15-06-2021, 16:13
Написал так, но ничего не происходит. Подскажите, пожалуйста. »
1. Я не могу проверить, у меня нет ни psexec.exe, ни других компьютеров
2. В workflow в InlineScript {} необходимо использовать $using ($using:computer) переменную. Попробуйте.
3. Попробуйте без InlineScript {}, прямо в foreach () {}.
4. workflow test необходимо вызвать:
$computers = Get-Content -Path C:\comps.txt
workflow test {
param ([string[]]$computers)
....
}
test $computers
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.