خطأ عند الاتصال بالجهة الثالثة القابلة للتنفيذ من PowerShell عند استخدام IDE

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

  •  21-09-2019
  •  | 
  •  

سؤال

لديّ نص PowerShell يستخدم du.exe (إستخدام القرص في الأصل من sysinternals) لحساب حجم الدلائل.

إذا ركضت du c:\Backup في وحدة التحكم ، يعمل كما هو متوقع ، ولكن نفس سطر الكود الذي يتم تشغيله في ISE أو PowerGui يعطي النتيجة المتوقعة بالإضافة إلى الخطأ

+ du <<<<  c:\backup
+ CategoryInfo          : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

لماذا هذا؟ كيف أتجنب هذا الخطأ؟ حاولت الاحتجاج بالتعبير ، باستخدام &, ، ولكن لا تذهب.

شكرا للمساعدة.

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

المحلول

لتجنب ذلك ، يمكنك إعادة توجيه STDERR إلى NULL على سبيل المثال:

du 2> $null

بشكل أساسي ، يعالج مضيف وحدة التحكم و ISE (وكذلك عن بعد) دفق Stderr بشكل مختلف. على مضيف وحدة التحكم ، كان من المهم أن يدعم PowerShell تطبيقات مثل Edit.com للعمل مع التطبيقات الأخرى التي تكتب الإخراج الملون والأخطاء على الشاشة. إذا لم يتم إعادة توجيه دفق I/O على مضيف وحدة التحكم ، فإن PowerShell يعطي Exe الأصلي مقبض وحدة تحكم للكتابة إليه مباشرة. هذا يتجاوز PowerShell حتى لا يستطيع PowerShell رؤية أن هناك أخطاء مكتوبة بحيث لا يمكن الإبلاغ عن الخطأ عبر خطأ $ أو عن طريق الكتابة إلى دفق Stderr من PowerShell.

لا تحتاج ISE و Remoting إلى دعم هذا السيناريو بحيث يرون الأخطاء على STDERR ثم يكتبون الخطأ وتحديث خطأ $.

نصائح أخرى

لقد واجهت مؤخرًا نفس المشكلات ، لكنني أود الحصول على إخراج STDERR الموجهة إلى stdout. قد تعتقد أن ما يلي سيعمل:

    & du 2>&1

لكن PowerShell سوف يفسر إعادة التوجيه ومعالجته بعد اكتمال "du". إن العمل الذي وجدته هو استدعاءه باستخدام cmd.exe /c:

    & cmd /c 'du 2>&1'

طريقة أخرى لقمع NativeCommandError الإخراج هو تحويل أشياء في خط الأنابيب إلى سلاسل كما هو موضح في أسفل هذا الجواب:

du c:\Backup 2>&1 | %{ "$_" }

محاولة:

du 2>&1 | %{ "$_" }

سيقوم الإصلاح السابق بإعادة توجيه الأخطاء ولكن قد تفقد خطأ حقيقيًا إذا لم يكن اسم المستخدم أو كلمة المرور الخاصة بك غير جيدًا أو إذا كنت تستخدم مصادقة متكاملة ، فلا يمكنك الوصول.

لذا ، إليك طريقة لتنفيذ معالجة الأخطاء وتجاوز الخطأ المحدد (هذا ليس واحدًا) الذي أثاره Psexec.

 try{
            	psexec command .....
            }
            catch [System.Management.Automation.RemoteException]{
                if ($_.TargetObject -like "Connecting to *" -and $_.CategoryInfo.Category -eq "NotSpecified" -and $_.FullyQualifiedErrorId -eq "NativeCommandError" -and $_.InvocationInfo.MyCommand.Name -like "psexec*.exe"){
                    $error.Remove[$Error[0]]
                }
                else{
                    Throw
                }
            }        
            catch{
                throw
            }

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top