
Parfois, vous devez imprimer rapidement un grand nombre de
photos avec des cachets de documents, mais je ne veux pas ouvrir tous les fichiers pour cela. La première chose qui suggère est l'utilisation du menu contextuel de l'Explorateur, mais cette méthode a ses limites et ses nuances. J'ai donc dû chercher une alternative. Pour plus de détails - veuillez, sous cat.
Nous analysons la situation et collectons des données
Le sujet de l'impression par lots a été abordé à plusieurs reprises dans les
travaux de grands spécialistes sur les articles Internet. Par exemple, dans
ceci et
cela .

Nous commencerons par déterminer les fonctionnalités dont les utilisateurs finaux ont besoin. À la suite de la communication avec des collègues, nous avons obtenu la liste suivante:
- Seuls les fichiers XML doivent être imprimés.
- le formatage pour XML n'est pas requis;
- sur papier, en plus du contenu, le nom du fichier à imprimer doit également être indiqué;
- les fichiers doivent être triés par nom afin qu'il soit pratique de classer les feuilles de papier dans l'archive.
La plus simple et la plus évidente est peut-être l'impression à partir du menu contextuel de l'Explorateur, qui peut être lu
ici et
ici . Le deuxième lien fournit des informations sur la suppression de l'élément "Imprimer" pour certains types de fichiers, mais le lecteur intelligent comprendra facilement comment, au contraire, vous pouvez ajouter celui qui manque.
Mais cette méthode présente au moins deux inconvénients:
- Vous ne pouvez pas imprimer plus de 15 fichiers à la fois;
- les fichiers sont imprimés dans un ordre aléatoire (peut-être y a-t-il encore de la logique, mais je ne l'ai pas trouvée), et non dans la façon dont ils sont triés dans l'Explorateur.
Le premier inconvénient est
facilement corrigé par le registre tweak. Pour résoudre le second il y a des
recommandations sous forme de danses avec un tambourin, mais chez nous les dieux sont sévères et ces rituels n'ont pas aidé.
Il existe des solutions tierces prêtes à l'emploi (des liens vers des articles contenant des informations à leur sujet sont fournis ci-dessus). Mais pour un usage commercial, vous devrez payer pour ces produits, et c'est toujours agréable
de marteler une élégante béquille et d'inventer un autre vélo pour faire quelque chose de vos propres mains.
Nous sélectionnons un outil et développons une solution
Remarque Afin de ne pas traduire le papier, il est pratique d'utiliser une imprimante virtuelle au stade de la préparation et du test du script. J'étais satisfait de Microsoft XPS Document Writer, mais il y a aussi
PDF24 Creator ,
doPDF ,
CutePDF Writer - comme on dit, il a le goût et la couleur ...
PowerShell a été choisi comme langue. Dans la configuration de base, le script ressemble à ceci:
Option 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 }
L'impression se fait au moyen d'un bloc-notes Windows standard (afin de ne pas rester inactif).
Comme vous pouvez le voir sur la 3ème ligne, le tri dans l'exemple se fait par le nom du fichier (
Nom ). Au lieu de cela, vous pouvez prendre comme base la taille (
Longueur ) ou la date de la modification (
LastWriteTime ). Si vous avez besoin de quelque chose de plus exotique, vous pouvez aller
ici .
Pour trier dans l'ordre inverse, l'
applet de commande
Sort-Object a le
commutateur -Descending .
Dans cette option, l'impression se fait par défaut sur l'imprimante et nous sommes satisfaits de ce comportement. Si vous devez imprimer sur une imprimante autre que l'imprimante par défaut, le bloc-notes a l'option
/ PT .
En conséquence, le code prendra la forme suivante:
<...> $PrinterName = "\\server2\Network Printer" <...> Start-Process -FilePath notepad -ArgumentList ("/PT `"$PrinterName`" `"" + $_.FullName + "`"") -Wait <...>
De même, au lieu du bloc-notes, vous pouvez utiliser n'importe quel autre programme, selon le format de fichier que vous souhaitez imprimer. L'essentiel est qu'il prend en charge l'impression via l'interface de ligne de commande.
Remarque Si vous apprivoisez Adobe Reader, gardez à l'esprit
cet ancien bug. Dans notre environnement, cela se manifeste encore, vous avez peut-être plus de chance. Il y a aussi un
bon article sur l'impression de PDF à partir de PowerShell.
Si à la sortie vous avez seulement besoin de texte «nu» à partir d'un moteur de texte normal, alors la 5ème ligne de l'option 0 prendra cette forme:
Get-Content $_.FullName | Out-Printer -Name $PrinterName
Pour imprimer sur l'imprimante par défaut, le paramètre
-Name doit être omis.
Notre tâche a nécessité l'impression de fichiers à partir de plusieurs emplacements. En ajoutant légèrement l'option 0, nous obtenons
Option 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 " }
Pour la décence, une fonction de gestion des exceptions a été ajoutée. Et si, par exemple, le dossier à partir duquel les fichiers sont imprimés est devenu inaccessible, l'impression sera interrompue et l'utilisateur sera informé en conséquence. Soit dit en passant, il est à noter que le bloc-notes renvoie 0 dans le code de sortie même lors de la tentative d'impression d'un fichier inexistant / inaccessible, mais jure dans l'interface graphique.
Après avoir essayé l'option 1, les utilisateurs ont été invités à donner la possibilité de sélectionner un dossier et des fichiers spécifiques, donc un peu d'interactivité a été ajoutée en tant que boîte de dialogue de sélection de fichiers. Il est donc apparu
Option 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 }
Maintenant, au démarrage, nous obtenons la fenêtre familière de l'Explorateur Windows avec une sélection pratique des fichiers nécessaires:
Vous pouvez en savoir plus sur l'utilisation de la boîte de dialogue d'ouverture de fichier dans la
documentation officielle , et quiconque souhaite en savoir plus sur l'interface graphique PowerShell peut facilement trouver beaucoup de matériel sur le réseau, il existe même un
concepteur de formulaire en ligne .
La gestion des exceptions dans la deuxième option a été supprimée depuis les informations interactives sur l'utilisateur ont été laissées au conducteur et au bloc-notes.
Lorsque vous exécutez le code à partir d'ISE, la boîte de dialogue de sélection de fichier s'affiche en arrière-plan (
Ctrl + Tab pour vous aider), mais à partir de la ligne de commande, tout fonctionne comme prévu. Notez également que la propriété
ShowHelp doit être
$ true pour contourner
ce bogue.
Je voudrais également attirer l'attention sur la propriété
InitialDirectory . Le capuchon vous indique qu'il détermine le chemin d'accès au dossier, qui sera sélectionné par défaut au démarrage du script. Mais, étant donné que l'explorateur «se souvient» du dernier emplacement sélectionné spécifié par l'utilisateur dans la boîte de dialogue de sélection de fichier,
InitialDirectory ne peut être utile que lors de la première exécution du script.
L'option 2 convenait parfaitement à nos utilisateurs, nous nous sommes donc arrêtés. Mais si vous avez besoin d'une option avec des
dames et une interactivité de
préférence et un tri différent du nom (par exemple, à la date du changement), cela est également possible. Nous obtenons
Option 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 }
Parce que des paramètres tels que la taille du fichier ou la date de création ne peuvent pas être directement extraits de l'objet
$ OpenFileDialog , puis nous utilisons l'applet de
commande Get-ChildItem pour obtenir une liste de tous les fichiers du dossier sélectionné par l'utilisateur, puis ne laisser que ceux qui ont été sélectionnés par l'utilisateur et trier les sous la forme dont nous avons besoin.
Nous donnons en production

Après vous être assuré que tout fonctionne comme il se doit, placez le script dans un dossier réseau et affichez un raccourci sur le bureau pour les utilisateurs.
Et pour que notre petit script sans défense ne soit pas offensé par les mauvaises
politiques d'exécution , nous le cachons dans un tel shell:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File "\\server\share\Scripts\BulkPrint.ps1"
Ou vous pouvez
envelopper dans un fichier batch de tube chaud.
Entre autres, dans un environnement d'entreprise, des
politiques de restriction logicielle sévères et un
AppLocker impitoyable, ainsi que d'autres logiciels de sécurité, peuvent interférer avec le démarrage du script, mais cela dépasse le cadre de cet article.
Vous pouvez ajouter du brillant en définissant une belle icône pour le raccourci. J'ai choisi ceci:
S'il existe de nombreux utilisateurs de notre script, vous pouvez distribuer massivement le raccourci à l'aide des
préférences de stratégie de groupe .
Résumé

Cela se produit si déployé sans test préalable.
Et nous aurons comme ça:

Et enfin, une pensée séditieuse: que faire si vous pensez dans une direction différente et au lieu de tout ce qui est décrit ci-dessus, communiquez avec les patrons et réorganisez le processus de travail?
