Mencetak massal di Windows

Terkadang Anda perlu dengan cepat mencetak banyak gambar dengan segel dokumen, tetapi saya tidak ingin membuka setiap file untuk ini. Hal pertama yang disarankan adalah penggunaan menu konteks Explorer, tetapi metode ini memiliki keterbatasan dan nuansa. Karena itu, saya harus mencari alternatif. Untuk detail - tolong, di bawah kucing.

Kami menganalisis situasi dan mengumpulkan data


Topik pencetakan batch telah berulang kali dibahas dalam karya - karya para ulama besar di artikel Internet. Misalnya, dalam ini dan ini .

Kami akan mulai dengan mencari tahu apa fungsi yang dibutuhkan pengguna akhir. Sebagai hasil komunikasi dengan kolega, kami mendapat daftar berikut:

  • Hanya file XML yang perlu dicetak.
  • pemformatan untuk XML tidak diperlukan;
  • di atas kertas, di samping isinya, nama file yang akan dicetak juga harus ditunjukkan;
  • file harus disortir berdasarkan nama sehingga nyaman untuk mengajukan lembaran kertas dalam arsip.

Mungkin yang paling sederhana dan paling jelas adalah mencetak dari menu konteks Explorer, yang dapat dibaca di sini dan di sini . Tautan kedua memberikan informasi tentang penghapusan item "Cetak" untuk jenis file tertentu, tetapi pembaca yang pintar akan dengan mudah memahami dari situ bagaimana, sebaliknya, Anda dapat menambahkan yang hilang.

Tetapi metode ini memiliki setidaknya dua kelemahan:

  1. Anda tidak dapat mencetak lebih dari 15 file sekaligus;
  2. file dicetak dalam urutan acak (mungkin masih ada logika, tapi saya tidak menemukannya), dan tidak dengan cara mereka diurutkan di Explorer.

Kelemahan pertama mudah diperbaiki oleh registry tweak. Untuk menyelesaikan yang kedua ada rekomendasi dalam bentuk tarian dengan rebana, tetapi di tengah-tengah kita para dewa sangat keras dan ritual ini tidak membantu.
Ada solusi pihak ketiga yang siap pakai (tautan ke artikel dengan informasi tentang mereka diberikan di atas). Tetapi untuk penggunaan komersial, Anda harus membayar untuk produk-produk ini, dan itu selalu menyenangkan untuk memalu kruk yang elegan dan menciptakan sepeda lain untuk melakukan sesuatu dengan tangan Anda sendiri.

Kami memilih alat dan mengembangkan solusi


Catatan Agar tidak menerjemahkan kertas, lebih mudah menggunakan printer virtual pada tahap persiapan dan pengujian skrip. Saya puas dengan Microsoft XPS Document Writer biasa, tetapi ada juga Pencipta PDF24 , doPDF , CutePDF Writer - seperti kata mereka, rasanya dan warnanya ...

PowerShell dipilih sebagai bahasa. Dalam konfigurasi dasar, skripnya terlihat seperti ini:

Opsi 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 } 


Pencetakan dilakukan dengan menggunakan notepad Windows biasa (agar tidak berdiri diam).
Seperti yang dapat Anda lihat dari baris ke-3, pengurutan dalam contoh terjadi berdasarkan nama file ( Nama ). Sebagai gantinya, Anda dapat mengambil sebagai dasar ukuran ( Panjang ) atau tanggal perubahan ( LastWriteTime ). Jika Anda membutuhkan sesuatu yang lebih eksotis, Anda bisa pergi ke sini .

Untuk mengurutkan dalam urutan terbalik, cmdlet Sort-Object memiliki -Descending switch .

Dalam opsi ini, pencetakan masuk ke printer secara default, dan kami puas dengan perilaku ini. Jika Anda perlu mencetak ke printer selain yang standar, notepad memiliki opsi / PT .

Dengan demikian, kode akan mengambil bentuk berikut:

 <...> $PrinterName = "\\server2\Network Printer" <...> Start-Process -FilePath notepad -ArgumentList ("/PT `"$PrinterName`" `"" + $_.FullName + "`"") -Wait <...> 

Demikian pula, alih-alih notepad, Anda dapat menggunakan program lain, tergantung pada format file apa yang ingin Anda cetak. Yang utama adalah mendukung pencetakan melalui antarmuka baris perintah.

Catatan Jika Anda akan menjinakkan Adobe Reader, ingatlah bug lama ini . Di lingkungan kita, itu masih mewujud, mungkin Anda lebih beruntung. Ada juga artikel bagus tentang mencetak PDF dari PowerShell.

Jika pada output Anda hanya perlu teks "telanjang" dari mesin teks biasa, maka baris ke-5 opsi 0 akan mengambil formulir ini:

  Get-Content $_.FullName | Out-Printer -Name $PrinterName 

Untuk mencetak ke printer default, parameter -Name harus dihilangkan.

Tugas kami diperlukan mencetak file dari beberapa lokasi. Sedikit menambahkan opsi 0, kita dapatkan

Opsi 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  " } 


Untuk kesopanan, fungsi penanganan pengecualian telah ditambahkan. Dan jika, misalnya, folder dari mana file dicetak telah menjadi tidak dapat diakses, maka proses pencetakan akan terganggu dan pemberitahuan yang sesuai akan ditampilkan kepada pengguna. By the way, diketahui bahwa notebook mengembalikan 0 dalam kode keluar bahkan ketika mencoba untuk mencetak file tidak ada / tidak dapat diakses, tetapi bersumpah dalam GUI.

Setelah mencoba opsi 1, pengguna diminta untuk memberikan opsi untuk memilih folder dan file tertentu di dalamnya, sehingga sedikit interaktivitas ditambahkan sebagai kotak dialog pemilihan file. Jadi itu muncul

Opsi 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 } 


Sekarang, saat startup, kita mendapatkan jendela Windows Explorer yang familier dengan pilihan nyaman dari file yang diperlukan:

klik


Anda dapat membaca lebih lanjut tentang bekerja dengan dialog buka file di dokumentasi resmi , dan siapa pun yang ingin mempelajari lebih lanjut tentang GUI PowerShell dapat dengan mudah menemukan banyak materi di jaringan, bahkan ada perancang formulir online .

Penanganan pengecualian di opsi kedua telah dihapus sejak informasi pengguna interaktif diserahkan kepada konduktor dan notepad.

Ketika Anda menjalankan kode dari ISE, kotak dialog pemilihan file ditampilkan di latar belakang ( Ctrl + Tab untuk membantu), tetapi dari baris perintah semuanya berfungsi seperti yang diharapkan. Perhatikan juga bahwa properti ShowHelp harus bernilai $ true untuk mengatasi bug ini .

Saya juga ingin menarik perhatian ke properti InitialDirectory . Tutup memberitahu Anda bahwa itu menentukan path ke folder, yang akan dipilih secara default ketika skrip dimulai. Namun, mengingat bahwa penjelajah "mengingat" lokasi yang dipilih terakhir yang ditentukan oleh pengguna dalam dialog pemilihan file, InitialDirectory hanya dapat bermanfaat saat skrip dijalankan pertama kali.

Opsi 2 sepenuhnya cocok untuk pengguna kami, jadi kami berhenti menggunakannya. Tetapi jika Anda memerlukan opsi dengan wanita dan interaktivitas preferensi dan penyortiran berbeda dari nama (misalnya, pada tanggal perubahan), ini juga layak. Kami mendapatkan

Opsi 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 } 


Karena parameter seperti ukuran file atau tanggal pembuatan tidak dapat langsung diekstraksi dari objek $ OpenFileDialog , maka kami menggunakan cmdlet Get-ChildItem untuk mendapatkan daftar semua file di folder yang dipilih oleh pengguna, dan kemudian hanya menyisakan yang dipilih oleh pengguna dan mengurutkannya. mereka dalam bentuk yang kita butuhkan.

Kami menyerah dalam produksi


Setelah memastikan bahwa semuanya berfungsi sebagaimana mestinya, letakkan skrip di folder jaringan dan tampilkan pintasan ke desktop untuk pengguna.

Dan agar skrip kecil kami yang tidak berdaya tidak tersinggung oleh Kebijakan Eksekusi yang jahat, kami sembunyikan di kulit yang seperti ini:

 powershell.exe -NoLogo -ExecutionPolicy Bypass -File "\\server\share\Scripts\BulkPrint.ps1" 

klik


Atau Anda dapat membungkus file batch tabung hangat.

Antara lain, dalam lingkungan perusahaan, Kebijakan Pembatasan Perangkat Lunak yang keras dan AppLocker yang kejam, serta perangkat lunak keamanan lainnya, dapat mengganggu startup skrip, tetapi ini berada di luar cakupan artikel ini.

Anda dapat menambahkan gloss dengan mengatur ikon yang indah untuk pintasan. Saya memilih ini:

klik


Jika ada banyak pengguna skrip kami, Anda dapat secara besar-besaran mendistribusikan pintasan menggunakan Preferensi Kebijakan Grup .

Ringkasan




Ini terjadi jika diluncurkan tanpa pengujian sebelumnya.

Dan kita akan memiliki seperti ini:



Dan akhirnya, pemikiran yang menghasut: bagaimana jika Anda berpikir ke arah yang berbeda dan bukannya semua yang dijelaskan di atas berkomunikasi dengan bos Anda dan mengatur ulang alur kerja Anda?

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


All Articles