
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:
- Anda tidak dapat mencetak lebih dari 15 file sekaligus;
- 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:
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"
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:
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?
