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

سنبدأ بتحديد الوظائف التي يحتاجها المستخدمون النهائيون. نتيجة للتواصل مع الزملاء ، حصلنا على القائمة التالية:
- تحتاج فقط ملفات XML إلى طباعتها.
- تنسيق XML غير مطلوب ؛
- على الورق ، بالإضافة إلى المحتويات ، يجب الإشارة إلى اسم الملف المراد طباعته ؛
- يجب فرز الملفات حسب الاسم حتى يكون ملائماً تقديم أوراق ورقية في الأرشيف.
ربما تكون الطباعة هي أبسط والأكثر وضوحًا من قائمة سياق Explorer ، والتي يمكن قراءتها
هنا وهنا . يوفر الرابط الثاني معلومات حول إزالة عنصر "طباعة" لأنواع معينة من الملفات ، ولكن القارئ الذكي سوف يفهم بسهولة منه كيف يمكنك ، على العكس ، إضافة العنصر المفقود.
لكن هذه الطريقة لها عيبان على الأقل:
- لا يمكنك طباعة أكثر من 15 ملفًا في كل مرة ؛
- تتم طباعة الملفات بترتيب عشوائي (ربما لا يزال هناك منطق ، لكنني لم أجده) ، وليس بالطريقة التي يتم فرزها بها في Explorer.
يتم إصلاح العائق الأول
بسهولة بواسطة سجل القرص. لحل الثاني هناك
توصيات في شكل رقصات مع الدف ، ولكن في وسطنا الآلهة شديدة وهذه الطقوس لم تساعد.
هناك حلول جهة خارجية جاهزة (يتم توفير روابط لمقالات تحتوي على معلومات عنها أعلاه). ولكن للاستخدام التجاري ، سيتعين عليك دفع ثمن هذه المنتجات ، وسيكون من الجيد دائمًا
طرح عكاز أنيق وابتكار دراجة أخرى للقيام بشيء بأيديك.
نختار أداة وتطوير الحل
ملاحظة من أجل عدم ترجمة الورق ، من المريح استخدام طابعة افتراضية في مرحلة إعداد البرنامج النصي واختباره. لقد كنت راضيًا عن Microsoft XPS Document Writer العادي ، لكن هناك أيضًا
PDF24 Creator و
doPDF و
CutePDF Writer - كما يقولون ، كان مذاقه والألوان ...
تم اختيار PowerShell كلغة. في التكوين الأساسي ، يبدو البرنامج النصي كما يلي:
الخيار 0$FolderToPrint = "\\server\share\Folder" $FileMask = "*.xml" $FolderToPrint | Get-ChildItem -File -Filter $FileMask | Sort-Object Name | ForEach-Object { Write-Output (" `"" + $_.FullName + "`"") Start-Process -FilePath notepad -ArgumentList ("/P `"" + $_.FullName + "`"") -Wait }
تتم الطباعة عن طريق برنامج Windows العادي للمفكرة (حتى لا تقف مكتوفة الأيدي).
كما ترون من السطر الثالث ، يحدث الفرز في المثال حسب اسم الملف (
الاسم ). بدلاً من ذلك ، يمكنك أن تأخذ كأساس (
الطول ) أو تاريخ التغيير (
LastWriteTime )
كأساس . إذا كنت بحاجة إلى شيء أكثر غرابة ، يمكنك الذهاب
هنا .
للفرز بترتيب عكسي ، يحتوي الأمر
cmdlet لـ Sort-Object على
مفتاح التبديل -Descending .
في هذا الخيار ، تنتقل الطباعة إلى الطابعة افتراضيًا ، ونحن راضون عن هذا السلوك. إذا كنت بحاجة إلى الطباعة إلى طابعة أخرى غير الطابعة الافتراضية ، فسيحتوي المفكرة على خيار
/ PT .
وفقًا لذلك ، سوف يأخذ الرمز النموذج التالي:
<...> $PrinterName = "\\server2\Network Printer" <...> Start-Process -FilePath notepad -ArgumentList ("/PT `"$PrinterName`" `"" + $_.FullName + "`"") -Wait <...>
وبالمثل ، بدلاً من المفكرة ، يمكنك استخدام أي برنامج آخر ، اعتمادًا على تنسيق الملف الذي تريد طباعته. الشيء الرئيسي هو أنه يدعم الطباعة من خلال واجهة سطر الأوامر.
ملاحظة إذا قمت بترويض برنامج Adobe Reader ، ضع في اعتبارك
هذا الخطأ القديم. في بيئتنا ، لا يزال يظهر ، ربما كنت محظوظًا أكثر. هناك أيضًا
مقال جيد حول طباعة ملفات PDF من PowerShell.
إذا كنت في الإخراج تحتاج فقط إلى نص "مكشوف" من محرك نص عادي ، فسيأخذ السطر الخامس من الخيار 0 هذا النموذج:
Get-Content $_.FullName | Out-Printer -Name $PrinterName
للطباعة إلى الطابعة الافتراضية ،
يجب حذف المعلمة
-Name .
مهمتنا تتطلب طباعة الملفات من عدة مواقع. مضيفا قليلا الخيار 0 ، نحصل عليه
الخيار 1 $FolderToPrint = @( "\\server1\share\Folder1", "\\server1\share\Folder2", "\\server1\share\Folder3" ) $FileMask = "*.xml" $ErrorActionPreference = "Stop" Try { $FolderToPrint | Get-ChildItem -File -Filter $FileMask | Sort-Object Name | ForEach-Object { Write-Output (" `"" + $_.FullName + "`"") Start-Process -FilePath notepad -ArgumentList ("/P `"" + $_.FullName + "`"") -Wait } } Catch { Write-Host " :" Write-Host $Error[0] -ForegroundColor Red Read-Host " ENTER " }
للحشمة ، تمت إضافة وظيفة معالجة استثناء. وإذا كان ، على سبيل المثال ، أصبح المجلد الذي تتم طباعة الملفات منه غير ممكن الوصول إليه ، فستتم مقاطعة عملية الطباعة وسيتم عرض الإشعار المقابل للمستخدم. بالمناسبة ، يلاحظ أن دفتر الملاحظات يُرجع 0 في رمز الخروج حتى عند محاولة طباعة ملف غير موجود / يتعذر الوصول إليه ، ولكن يقسم في واجهة المستخدم الرسومية.
بعد تجربة الخيار 1 ، طُلب من المستخدمين إعطاء خيار لتحديد مجلد وملفات محددة فيه ، لذلك تمت إضافة القليل من التفاعل كمربع حوار تحديد ملف. هكذا بدا
الخيار 2 Add-Type -AssemblyName System.Windows.Forms | Out-Null $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog $OpenFileDialog.InitialDirectory = "\\server\share" $OpenFileDialog.Multiselect = $True $OpenFileDialog.Filter = "XML- (*.xml)|*.xml| (*.*)|*.*" $OpenFileDialog.ShowHelp = $true $OpenFileDialog.ShowDialog() | Out-Null $FilesToPrint = $OpenFileDialog.FileNames | Sort-Object ForEach ($FullFileName in $FilesToPrint) { Write-Output " `"$FullFileName`"" Start-Process -FilePath notepad -ArgumentList ("/P `"$FullFileName`"") -Wait }
الآن ، عند بدء التشغيل ، نحصل على نافذة Windows Explorer المألوفة مع تحديد مناسب للملفات الضرورية:
يمكنك قراءة المزيد حول العمل مع مربع الحوار "فتح ملف" في
الوثائق الرسمية ، وأي شخص يريد معرفة المزيد حول PowerShell GUI يمكنه بسهولة العثور على الكثير من المواد على الشبكة ، بل يوجد
مصمم نماذج عبر الإنترنت .
تمت إزالة معالجة الاستثناء في الخيار الثاني منذ ذلك الحين تم ترك معلومات المستخدم التفاعلية إلى الموصل والمفكرة.
عند تشغيل التعليمات البرمجية من ISE ، يتم عرض مربع حوار تحديد الملف في الخلفية (
Ctrl + Tab للمساعدة) ، ولكن من سطر الأوامر ، يعمل كل شيء كما هو متوقع. لاحظ أيضًا أن خاصية
ShowHelp يجب أن تكون
$ true للتغلب على
هذا الخطأ.
أود أيضًا أن
ألفت الانتباه إلى خاصية
InitialDirectory . يخبرك الحد الأقصى بأنه يحدد المسار إلى المجلد ، والذي سيتم تحديده افتراضيًا عند بدء تشغيل البرنامج النصي. لكن بالنظر إلى أن المستكشف "يتذكر" آخر موقع تم تحديده بواسطة المستخدم في مربع حوار تحديد الملف ، يمكن أن يكون
InitialDirectory مفيدًا فقط عند تشغيل البرنامج النصي لأول مرة.
كان الخيار 2 مناسبًا تمامًا لمستخدمينا ، لذلك توقفنا عنه. ولكن إذا كنت بحاجة إلى خيار مع
السيدات وتفضيل التفاعل والفرز مختلف عن الاسم (على سبيل المثال ، بحلول تاريخ التغيير) ، فإن هذا ممكن أيضًا. نحن نحصل عليها
الخيار 3 Add-Type -AssemblyName System.Windows.Forms | Out-Null $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog $OpenFileDialog.InitialDirectory = "\\server\share" $OpenFileDialog.Multiselect = $True $OpenFileDialog.Filter = "XML- (*.xml)|*.xml| (*.*)|*.*" $OpenFileDialog.ShowHelp = $true $OpenFileDialog.ShowDialog() | Out-Null $SelectedFiles = $OpenFileDialog.FileNames # , If (!($SelectedFiles)) { Break } # $SelectedDir = (Split-Path -Parent $OpenFileDialog.FileName) # $FilesToPrint = Get-ChildItem -Path $SelectedDir -Force | # , Where-Object {$_.FullName -in $OpenFileDialog.FileNames} | # Sort-Object -Property LastWriteTime ForEach ($File in $FilesToPrint) { $FullFileName = $File.FullName Write-Output " `"$FullFileName`"" Start-Process -FilePath notepad -ArgumentList ("/P `"$FullFileName`"") -Wait }
بسبب لا يمكن استخراج معلمات مثل حجم الملف أو تاريخ الإنشاء مباشرة من كائن
$ OpenFileDialog ، ثم نستخدم الأمر
Get-ChildItem cmdlet للحصول على قائمة بجميع الملفات الموجودة في المجلد المحدد بواسطة المستخدم ، ثم نترك فقط تلك التي تم تحديدها بواسطة المستخدم والفرز لهم في الشكل الذي نحتاجه.
نعطي في الإنتاج

بعد التأكد من أن كل شيء يعمل كما يجب ، ضع البرنامج النصي في مجلد شبكة وعرض اختصار على سطح المكتب للمستخدمين.
وحتى لا يتأثر برنامجنا الصغير الشرير
بسياسة التنفيذ الشريرة ، فإننا نخفيه في مثل هذه القشرة:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File "\\server\share\Scripts\BulkPrint.ps1"
أو يمكنك
لف في ملف دفعي أنبوب دافئ.
من بين أشياء أخرى ، في بيئة الشركة ، يمكن أن تتداخل
سياسات تقييد البرامج القاسية و
AppLocker القاسي ، بالإضافة إلى برامج الأمان الأخرى ، مع بدء تشغيل البرنامج النصي ، ولكن هذا يتجاوز نطاق هذه المقالة.
يمكنك إضافة لمعان من خلال تحديد رمز جميل للاختصار. اخترت هذا:
إذا كان هناك العديد من مستخدمي البرنامج النصي لدينا ، فيمكنك توزيع الاختصار على نطاق واسع باستخدام
تفضيلات سياسة المجموعة .
ملخص

يحدث هذا إذا تم طرحها دون اختبار مسبق.
وسيكون لدينا مثل هذا:

وأخيراً ، الفكر المثير للاشمئزاز: ماذا لو فكرت في اتجاه مختلف وبدلاً من كل ما هو موضح أعلاه ، تواصل مع أرباب العمل وإعادة تنظيم عملية العمل؟
