Предположим, у меня есть массив имен хостов Windows:Параллельный поиск пользовательских сеансов с нескольких серверов Windows, в PowerShell
$server_hostnames = @("server1","server2")
Для каждого сервера мне нужно найти, если есть какие-сессии для конкретного пользователя, а затем в идеале захватить все сеансы в новом массиве.
$results = @()
$account = "JohnDoe"
foreach ($s in $server_hostnames) {
$r = (qwinsta /server:$($s) 2> $null | out-string -stream | sls $account)
$results += $r
}
В этом примере у меня есть 2 сервера, но в производство я бы запустить его против 2-3000 серверов, поэтому параллельное выполнение является чрезвычайно важным.
Я сделал несколько попыток переписать код с использованием заданий, рабочих процессов или Split-Pipeline
, но с небольшим успехом. Обычно фильтрация с sls
(Select-String
) не работает, даже с findstr
.
Split-Pipeline
пример:
PS C:\SplitPipeline> $server_hostnames | Split-Pipeline {process{ $_; qwinsta /server:$($_) | out-string -stream | sls $account }} Split-Pipeline : Cannot bind argument to parameter 'Pattern' because it is null. At line:1 char:21 + $server_hostnames | Split-Pipeline {process{ $_; qwinsta /server:$($_) | out-str ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Split-Pipeline], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,SplitPipeline.SplitPipelineCommand
Похоже, что учетная запись $ имеет пустую стоимость. Откуда вы его назначаете? –
Это не нуль, в моем примере вы можете увидеть, что $ account = "JohnDoe" – PowerShellEnthusiast
Вы видите, что вы получаете, когда выполняете это: $ server_hostnames | Split-Pipeline {process {$ _; qwinsta/server: $ ($ _) | out-string -stream}} –