سؤال

أحاول تنفيذ ملف 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 لقد جربته على مربع في Domain2 أثناء تسجيل الدخول باستخدام مستخدم مسؤول المجال (نفس النتيجة).

هل كانت مفيدة؟

المحلول

جرب هذا لأمر Psexec ، مع التأكد من تضمين "-D" لعدم انتظار الاستجابة ، ووضع متغير الكمبيوتر مباشرة بعد psexec:

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

نصائح أخرى

تحدث هذه المشكلة المعلقة على خوادم Win2003 و Win2008.

يحل معظم الناس هذه المشكلة مع حل بديل مثل الصدى والأنابيب بحيث يحصل PowerShell على بعض المدخلات من Stdin.

ولكن يوجد حل داخل PowerShell. ما عليك سوى بدء تشغيل PowerShell مع الخيار -inputformat لا شيء مثل:

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