Impresi贸n masiva en Windows

A veces necesita imprimir r谩pidamente muchas im谩genes con sellos de documentos, pero no quiero abrir todos los archivos para esto. Lo primero que sugiere es el uso del men煤 contextual del Explorador, pero este m茅todo tiene sus limitaciones y matices. Por lo tanto, tuve que buscar una alternativa. Para m谩s detalles, por favor, debajo del cat.

Analizamos la situaci贸n y recopilamos datos.


El tema de la impresi贸n por lotes ha sido cubierto repetidamente en los trabajos de grandes acad茅micos sobre art铆culos de Internet. Por ejemplo, en esto y esto .

Comenzaremos por descubrir qu茅 funcionalidad necesitan los usuarios finales. Como resultado de la comunicaci贸n con colegas, obtuvimos la siguiente lista:

  • Solo se necesitan imprimir archivos XML.
  • no se requiere formatear para XML;
  • en papel, adem谩s del contenido, tambi茅n debe indicarse el nombre del archivo a imprimir;
  • los archivos deben clasificarse por nombre para que sea conveniente archivar hojas de papel en el archivo.

Quiz谩s lo m谩s simple y obvio es imprimir desde el men煤 contextual del Explorador, que se puede leer aqu铆 y aqu铆 . El segundo enlace proporciona informaci贸n sobre la eliminaci贸n del elemento "Imprimir" para ciertos tipos de archivos, pero el lector inteligente comprender谩 f谩cilmente c贸mo, por el contrario, puede agregar el que falta.

Pero este m茅todo tiene al menos dos inconvenientes:

  1. No puede imprimir m谩s de 15 archivos a la vez;
  2. los archivos se imprimen en orden aleatorio (quiz谩s todav铆a haya l贸gica, pero no la encontr茅), y no de la forma en que se ordenan en Explorer.

El primer inconveniente se soluciona f谩cilmente mediante el registro de ajustes. Para resolver el segundo hay recomendaciones en forma de bailes con pandereta, pero en nuestro medio los dioses son severos y estos ritos no ayudaron.
Existen soluciones de terceros listas para usar (los enlaces a art铆culos con informaci贸n sobre ellos se proporcionan m谩s arriba). Pero para uso comercial, tendr谩 que pagar por estos productos, y siempre es bueno martillar una muleta elegante e inventar otra bicicleta para hacer algo con sus propias manos.

Seleccionamos una herramienta y desarrollamos una soluci贸n


Nota Para no traducir el papel, es conveniente usar una impresora virtual en la etapa de preparaci贸n y prueba del gui贸n. Estaba satisfecho con el Escritor de documentos XPS de Microsoft, pero tambi茅n hay PDF24 Creator , doPDF , CutePDF Writer , como dicen, sabe y colorea ...

PowerShell fue elegido como el idioma. En la configuraci贸n b谩sica, el script se ve as铆:

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


La impresi贸n se realiza mediante un bloc de notas de Windows normal (para que no quede inactivo).
Como puede ver en la tercera l铆nea, la ordenaci贸n en el ejemplo ocurre por el nombre del archivo ( Nombre ). En su lugar, puede tomar como base el tama帽o ( Longitud ) o la fecha del cambio ( LastWriteTime ). Si necesitas algo m谩s ex贸tico, puedes ir aqu铆 .

Para ordenar en orden inverso, el cmdlet Sort-Object tiene el modificador -Descendente .

En esta opci贸n, la impresi贸n va a la impresora por defecto, y estamos satisfechos con este comportamiento. Si necesita imprimir en una impresora que no sea la predeterminada, el bloc de notas tiene la opci贸n / PT .

En consecuencia, el c贸digo tomar谩 la siguiente forma:

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

De manera similar, en lugar del bloc de notas, puede usar cualquier otro programa, dependiendo del formato de archivo que desee imprimir. Lo principal es que admite la impresi贸n a trav茅s de la interfaz de l铆nea de comandos.

Nota Si domesticas a Adobe Reader, ten en cuenta este viejo error. En nuestro entorno, todav铆a se est谩 manifestando, quiz谩s tengas m谩s suerte. Tambi茅n hay un buen art铆culo sobre la impresi贸n de archivos PDF desde PowerShell.

Si en la salida solo necesita texto "desnudo" de un motor de texto normal, entonces la quinta l铆nea de la opci贸n 0 tomar谩 esta forma:

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

Para imprimir en la impresora predeterminada, se debe omitir el par谩metro -Name .

Nuestra tarea requer铆a imprimir archivos desde varias ubicaciones. Agregando ligeramente la opci贸n 0, obtenemos

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


Por decencia, se ha agregado una funci贸n de manejo de excepciones. Y si, por ejemplo, la carpeta desde la que se imprimen los archivos se ha vuelto inaccesible, la impresi贸n se interrumpir谩 y el usuario ser谩 notificado en consecuencia. Por cierto, se observa que la computadora port谩til devuelve 0 en el c贸digo de salida incluso cuando intenta imprimir un archivo inexistente / inaccesible, pero insiste en la GUI.

Despu茅s de probar la opci贸n 1, se pidi贸 a los usuarios que dieran la opci贸n de seleccionar una carpeta y archivos espec铆ficos en ella, por lo que se agreg贸 un poco de interactividad como un cuadro de di谩logo de selecci贸n de archivos. Entonces apareci贸

Opci贸n 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 } 


Ahora, al inicio, obtenemos la familiar ventana del Explorador de Windows con una conveniente selecci贸n de los archivos necesarios:

haga clic


Puede leer m谩s sobre c贸mo trabajar con el cuadro de di谩logo de apertura de archivo en la documentaci贸n oficial , y cualquiera que quiera aprender m谩s sobre la GUI de PowerShell puede encontrar f谩cilmente una gran cantidad de material en la red, incluso hay un dise帽ador de formularios en l铆nea .

El manejo de excepciones en la segunda opci贸n se ha eliminado desde La informaci贸n interactiva del usuario se dej贸 al conductor y al bloc de notas.

Cuando ejecuta el c贸digo desde ISE, el cuadro de di谩logo de selecci贸n de archivo se muestra en segundo plano ( Ctrl + Tab para ayudar), pero desde la l铆nea de comandos todo funciona como se esperaba. Tambi茅n tenga en cuenta que la propiedad ShowHelp debe ser $ true para evitar este error.

Tambi茅n me gustar铆a llamar la atenci贸n sobre la propiedad InitialDirectory . El l铆mite le indica que determina la ruta a la carpeta, que se seleccionar谩 de manera predeterminada cuando se inicie el script. Pero, dado que el explorador "recuerda" la 煤ltima ubicaci贸n seleccionada que fue especificada por el usuario en el cuadro de di谩logo de selecci贸n de archivos, InitialDirectory solo puede ser 煤til cuando el script se ejecuta por primera vez.

La opci贸n 2 era completamente adecuada para nuestros usuarios, por lo que nos detuvimos. Pero si necesita una opci贸n con las mujeres y la interactividad de preferencia y la clasificaci贸n diferente del nombre (por ejemplo, por la fecha de cambio), esto tambi茅n es factible. Nosotros obtenemos

Opci贸n 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 } 


Porque par谩metros como el tama帽o del archivo o la fecha de creaci贸n no se pueden extraer directamente del objeto $ OpenFileDialog , luego usamos el cmdlet Get-ChildItem para obtener una lista de todos los archivos en la carpeta seleccionada por el usuario, y luego dejamos solo aquellos que fueron seleccionados por el usuario y los clasificamos ellos en la forma que necesitamos.

Damos en producci贸n


Despu茅s de asegurarse de que todo funcione como deber铆a, coloque el script en una carpeta de red y muestre un acceso directo al escritorio para los usuarios.

Y para que nuestro peque帽o gui贸n indefenso no se sienta ofendido por las pol铆ticas de ejecuci贸n malvadas, lo ocultamos en ese caparaz贸n:

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

haga clic


O puede envolverlo en un archivo por lotes de tubo caliente.

Entre otras cosas, en un entorno corporativo, las pol铆ticas de restricci贸n de software severas y el despiadado AppLocker , as铆 como otro software de seguridad, pueden interferir con el inicio del script, pero esto est谩 m谩s all谩 del alcance de este art铆culo.

Puede agregar brillo configurando un hermoso icono para el acceso directo. Eleg铆 esto:

haga clic


Si hay muchos usuarios de nuestro script, puede distribuir masivamente el acceso directo usando las Preferencias de directiva de grupo .

Resumen




Esto sucede si se implementa sin pruebas previas.

Y tendremos as铆:



Y finalmente, pensamiento sedicioso: 驴qu茅 pasa si piensas en una direcci贸n diferente y, en lugar de todo lo descrito anteriormente, te comunicas con los jefes y reorganizas el proceso de trabajo?

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


All Articles