معظم الطباعة في ويندوز

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

نقوم بتحليل الموقف وجمع البيانات


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

سنبدأ بتحديد الوظائف التي يحتاجها المستخدمون النهائيون. نتيجة للتواصل مع الزملاء ، حصلنا على القائمة التالية:

  • تحتاج فقط ملفات XML إلى طباعتها.
  • تنسيق XML غير مطلوب ؛
  • على الورق ، بالإضافة إلى المحتويات ، يجب الإشارة إلى اسم الملف المراد طباعته ؛
  • يجب فرز الملفات حسب الاسم حتى يكون ملائماً تقديم أوراق ورقية في الأرشيف.

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

لكن هذه الطريقة لها عيبان على الأقل:

  1. لا يمكنك طباعة أكثر من 15 ملفًا في كل مرة ؛
  2. تتم طباعة الملفات بترتيب عشوائي (ربما لا يزال هناك منطق ، لكنني لم أجده) ، وليس بالطريقة التي يتم فرزها بها في 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 القاسي ، بالإضافة إلى برامج الأمان الأخرى ، مع بدء تشغيل البرنامج النصي ، ولكن هذا يتجاوز نطاق هذه المقالة.

يمكنك إضافة لمعان من خلال تحديد رمز جميل للاختصار. اخترت هذا:

انقر فوق


إذا كان هناك العديد من مستخدمي البرنامج النصي لدينا ، فيمكنك توزيع الاختصار على نطاق واسع باستخدام تفضيلات سياسة المجموعة .

ملخص




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

وسيكون لدينا مثل هذا:



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

Source: https://habr.com/ru/post/ar441384/


All Articles