ما كان يجب القيام به
ذات مرة كنت بحاجة إلى الجمع بين مجموعة من الملفات النصية الموجودة في دليل واحد في ملف واحد. لم أكن أريد أن أفعل ذلك بيدي وجوجل جاء لمساعدتي ، كما هو الحال دائمًا ،! سمعت الكثير عن قوة أداة مثل PowerShell ، وقررت استخدامها لهذه "المهمة الضخمة". على الأقل لأنني لست على دراية ببؤس cmd.exe . حسنًا ، فعل ذلك بيديك ليس طريقنا.
ما الخطأ الذي حدث
أخبرتني Google أنه يمكنك القيام بذلك باستخدام أمر بسيط
Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt
"رائع حقا! مجرد نوع من طريقة يونكس!" فكرت. قمت بنسخ الأمر ، وتعديله قليلاً ، واضغط على Enter. انتقل المؤشر إلى سطر جديد ... ولا شيء أكثر من ذلك. في مدير الملفات ، فتحت الملف النهائي - كان حقًا شيء مشابه للنتيجة المرغوبة. كان لديه الكثير من الخطوط من الملفات المصدر. العودة إلى وحدة التحكم ، ورأيت أن العملية لا تزال ... في هذه العملية. ساعدت Ctrl + C.
بعد إلقاء نظرة فاحصة على حجم الملف ، رأيت أنه كبير إلى حد ما بشكل مثير للريبة. تجاوز حجمها 100 ميغابايت. على الرغم من أن بيانات المياه لم تكن كبيرة.
لماذا حدث هذا؟
كل شيء عن "التعديل السهل". أنا فقط لا تحتاج إلى مرشح التمديد. نعم ، وهذه المعلمة اختيارية. واتضح أن الفريق قام بإنشاء الملف الناتج ، ورأى أنه كان في الدليل ، وقراءته وكتب محتوياته مرة أخرى إلى النهاية وفعل ذلك حتى قمت بالضغط على Ctrl + C لم أستطع شرح النمو المستمر لملف الإخراج لأي شيء آخر
كررت هذا في ظل ظروف "معقمة". من أجل البساطة والنقاء ، قمت بإجراء التجربة في دليل منفصل ، لأنني أخشى أن أقتل آلة عاملة
أنا إنشاء ملف نصي
echo "Hello world" > hello.txt
أنا تنفيذ الأمر
Get-ChildItem | Get-Content | Out-File result.txt
أو في شكل قصير
dir | cat | Out-File result.txt
تتكرر المشكلة. ينمو الملف الناتج ، يتم تجديده بسطر من المصدر (أو خطوط من نفسه؟). في 10 ثوان من التنفيذ:
- سطر واحد من الملف المصدر يتحول إلى 400 ألف سطر
- زيادة حجم الملف من 11 بايت إلى حوالي 8 ميغابايت
- يتم تحميل المعالج بنحو 20-25 ٪.
- لا توجد حملات زائدة من النظام الفرعي للقرص أو RAM. على ما يبدو ، تم تحسين PowerShell جيدًا من حيث العمل مع هذه المكونات. )
إنه أمر مثير للاهتمام أيضًا - إذا حددت اسم الملف الوحيد في الدليل كمعلمة للأمر الأخير ، فعندئذ بالطبع ، خمنت لفة الأسطوانة ... ستتم كتابة الفراغ في الملف!
هذا هو منطق العمل "المثير للاهتمام"
ماذا حدث
يبدأ الملف الذي تم إنشاؤه في الخطوة الأولى في النمو. هذا السلوك غير متوقع على الأقل.
كان من المدهش أيضًا أن يستمر نظام التشغيل في العمل بشكل طبيعي. الملف ينمو ببطء (أم لا حقا؟) دون عرقلة عمل المستخدم.
ما هو خطير
ملء غير ملحوظ من مساحة القرص.
كيفية تجنب
تصفية قائمة ملفات الإدخال:
Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt
ولكن هذا لن ينقذ ، إذا كان كل من المدخلات والمخرجات تتطابق مع حالة التصفية
PS
أنا أستخدم الإصدار 5.1.17134.407 من PowerShell. بالمناسبة ، في محاولة لمعرفة ذلك ، جربت كل الأساليب / المنطق والحس السليم التي أعرفها (وهي أعلام مثل -Version - version -v -h ). لكن ذلك لم يساعد. ساعد ، كما هو الحال دائما ، Stackoverflow. إليك كيفية اكتشاف إصدار PowerShell
$PSVersionTable.PSVersion
جمعت هذه الإجابة ما يقرب من 3000 إعجاب! هذا بالتأكيد أقل من إجابة السؤال حول كيفية إغلاق vim ، لكني أعتقد أيضًا أنه مؤشر!
بشكل عام ، يعد PowerShell أمرًا قويًا (على الأقل بالمقارنة مع cmd.exe)! وبالطبع سأستمر في استخدامه.