PSExec никогда не завершается при запуске внутри start-job - PullRequest
6 голосов
/ 01 июля 2010

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

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

$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. Я пробовал его на компьютере в домене 2, когда вошел в систему с ИД администратора домена (тот же результат).

Ответы [ 4 ]

4 голосов
/ 28 августа 2012

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

d:\eps\pstools\psexec "\\$($computer)" /accepteula -u $userid -p $password -d cmd /c $command
2 голосов
/ 12 декабря 2014

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

Большинство людей решают эту проблему с помощью обходного пути, такого как эхо и пайпинг, так что powershell получает некоторую информацию от STDIN.

Но в powershell есть решение. Просто запустите powershell с параметром -inputformat none, например:

powershell -inputformat none -command ...
0 голосов
/ 18 декабря 2013
$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
}
0 голосов
/ 01 июля 2010

попробуйте параметр -accepteula для psexec, например

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

из

...