Psexec никогда не завершается при запуске внутри запуска

StackOverflow https://stackoverflow.com/questions/3154449

  •  01-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь выполнить файл CMD в списке 48 компьютеров. Я не хочу выполнять и ждать завершения последовательно, потому что каждый CMD занимает около 10 минут для завершения. WinRM не вариант. Ни WMI. Psexec. является Вариант .... Но я не могу сделать это работать внутри начальной работы.

Я делаю что-то вроде:

$sb = {
    param
    (
        $computer = "serverw01",
        $userid = "domain2\serviceid",
        $password = 'servicepw',
        $command = "cd /d d:\ && updateAll.cmd"
    )

    d:\eps\pstools\PsExec.exe -u $userid  -p $password "\\$($computer)" cmd /c $command
}

foreach ($computer in Get-Content "D:\Data\serverlist.txt") {
    Start-Job $sb -ArgumentList $computer
}

Это создает кучу рабочих мест .... но никогда не заканчивается, и если я получаю работу по любому из них, я вернусь

    PS> get-job | receive-job -Keep

    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

Это выполняет все отлично, если я запускаю функцию, как:

& $sb -computer "serverw01"

Инициирующий скрипт работает в PowerShell V2.0 на поле Server 2008R2, я попробовал его на коробке в domain2 во время вошении с доменом admin userid (тот же результат).

Это было полезно?

Решение

Попробуйте это для команды PSEXEC, обеспечение того, чтобы вы включали «-D», чтобы не ждать ответа, и поместите компьютерную переменную сразу после psexec:

d:\eps\pstools\psexec "\\$($computer)" /accepteula -u $userid -p $password -d cmd /c $command

Другие советы

Эта висительная проблема возникает на серверах Win2003 и Win2008.

Большинство людей решают эту проблему с обходным отделением, такими как эхом и трубопроводы, так что PowerShell получает некоторый вклад от stdin.

Но существует решение в PowerShell. Просто начните PowerShell с вариантом -Используйте формат не похоже на:

powershell -inputformat none -command ...

Пожалуйста, попробуйте параметр -Accepteula для Psexec, как

d:\eps\pstools\PsExec.exe -accepteula -u $userid  -p $password

от

$computerList = Get-Content "D:\Data\serverlist.txt"      
$sb = 
{ 
    param($name)
        }
            $computer = $name
            $userid = "domain2\serviceid"
            $password = 'servicepw'
            $command = "cd /d d:\ && updateAll.cmd"
            d:\eps\pstools\PsExec.exe -u $userid -p $password \\$computer cmd /c $command
         {
}
foreach ($computer in $computerLinst) {
    Start-Job $sb -ArgumentList $computer
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top