
Manchmal müssen Sie schnell viele
Bilder mit Siegeln von Dokumenten drucken, aber ich möchte nicht jede Datei dafür öffnen. Das erste, was vorgeschlagen wird, ist die Verwendung des Explorer-Kontextmenüs, aber diese Methode hat ihre Grenzen und Nuancen. Deshalb musste ich nach einer Alternative suchen. Für Details - bitte unter Katze.
Wir analysieren die Situation und sammeln Daten
Das Thema Batchdruck wurde wiederholt in den
Arbeiten großer Wissenschaftler zu Internetartikeln behandelt. Zum Beispiel in
diesem und
jenem .

Wir werden zunächst herausfinden, welche Funktionen Endbenutzer benötigen. Durch die Kommunikation mit Kollegen haben wir folgende Liste erhalten:
- Es müssen nur XML-Dateien gedruckt werden.
- Eine Formatierung für XML ist nicht erforderlich.
- Auf dem Papier sollte neben dem Inhalt auch der Name der zu druckenden Datei angegeben werden.
- Dateien sollten nach Namen sortiert sein, damit Papierblätter bequem im Archiv abgelegt werden können.
Am einfachsten und offensichtlichsten ist vielleicht das Drucken über das Explorer-Kontextmenü, das
hier und
hier gelesen
werden kann. Der zweite Link enthält Informationen zum Entfernen des Elements "Drucken" für bestimmte Dateitypen. Der Smart Reader wird jedoch leicht verstehen, wie Sie im Gegenteil das fehlende hinzufügen können.
Diese Methode hat jedoch mindestens zwei Nachteile:
- Sie können nicht mehr als 15 Dateien gleichzeitig drucken.
- Dateien werden in zufälliger Reihenfolge gedruckt (vielleicht gibt es noch Logik, aber ich habe sie nicht gefunden) und nicht so, wie sie im Explorer sortiert sind.
Der erste Nachteil kann
leicht durch die Tweak-Registrierung behoben werden. Um das zweite Problem zu lösen, gibt es
Empfehlungen in Form von Tänzen mit einem Tamburin, aber in unserer Mitte sind die Götter streng und diese Riten haben nicht geholfen.
Es gibt vorgefertigte Lösungen von Drittanbietern (Links zu Artikeln mit Informationen dazu finden Sie oben). Für den kommerziellen Gebrauch müssen Sie jedoch für diese Produkte bezahlen. Es ist immer schön
, eine elegante Krücke zu hämmern und ein anderes Fahrrad zu
erfinden , um etwas mit Ihren eigenen Händen zu tun.
Wir wählen ein Werkzeug aus und entwickeln eine Lösung
Hinweis Um das Papier nicht zu übersetzen, ist es zweckmäßig, während der Vorbereitung und des Testens des Skripts einen virtuellen Drucker zu verwenden. Ich war mit dem regulären Microsoft XPS Document Writer zufrieden, aber es gibt auch
PDF24 Creator ,
doPDF ,
CutePDF Writer - wie sie sagen, es schmeckt und färbt ...
Als Sprache wurde PowerShell ausgewählt. In der Grundkonfiguration sieht das Skript folgendermaßen aus:
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 }
Das Drucken erfolgt mit einem normalen Windows-Notizblock (um nicht untätig zu bleiben).
Wie Sie in der 3. Zeile sehen können, erfolgt die Sortierung im Beispiel nach dem Namen der Datei (
Name ). Stattdessen können Sie die Größe (
Länge ) oder das Datum der Änderung (
LastWriteTime ) als Grundlage verwenden. Wenn Sie etwas Exotischeres brauchen, können Sie
hier hingehen.
Um in umgekehrter Reihenfolge zu
sortieren, verfügt das
Cmdlet Sort-Object über den
Schalter -Descending .
Bei dieser Option wird standardmäßig gedruckt, und wir sind mit diesem Verhalten zufrieden. Wenn Sie auf einem anderen als dem Standarddrucker drucken müssen, verfügt der Editor über die Option
/ PT .
Dementsprechend hat der Code die folgende Form:
<...> $PrinterName = "\\server2\Network Printer" <...> Start-Process -FilePath notepad -ArgumentList ("/PT `"$PrinterName`" `"" + $_.FullName + "`"") -Wait <...>
In ähnlicher Weise können Sie anstelle des Notizblocks jedes andere Programm verwenden, je nachdem, welches Dateiformat Sie drucken möchten. Die Hauptsache ist, dass es das Drucken über die Befehlszeilenschnittstelle unterstützt.
Hinweis Wenn Sie Adobe Reader zähmen, denken Sie an
diesen alten Fehler. In unserer Umgebung manifestiert es sich immer noch, vielleicht haben Sie mehr Glück. Es gibt auch einen
guten Artikel zum Drucken von PDFs aus PowerShell.
Wenn Sie an der Ausgabe nur "bloßen" Text von einer normalen Text-Engine benötigen, hat die 5. Zeile von Option 0 folgende Form:
Get-Content $_.FullName | Out-Printer -Name $PrinterName
Um auf dem Standarddrucker zu drucken, muss der Parameter
-Name weggelassen werden.
Unsere Aufgabe bestand darin, Dateien von mehreren Orten aus zu drucken. Wenn wir Option 0 leicht hinzufügen, erhalten wir
Variante 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 " }
Aus Gründen des Anstands wurde eine Ausnahmebehandlungsfunktion hinzugefügt. Wenn beispielsweise auf den Ordner, aus dem die Dateien gedruckt werden, nicht mehr zugegriffen werden kann, wird der Druckvorgang unterbrochen und der Benutzer entsprechend benachrichtigt. Übrigens wird bemerkt, dass das Notebook im Exit-Code 0 zurückgibt, selbst wenn versucht wird, eine nicht vorhandene / nicht zugängliche Datei zu drucken, aber in der GUI schwört.
Nachdem Benutzer Option 1 ausprobiert hatten, wurden sie gebeten, die Option zum Auswählen eines Ordners und bestimmter darin enthaltener Dateien anzugeben. Daher wurde ein wenig Interaktivität als Dialogfeld zur Dateiauswahl hinzugefügt. So schien es
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 }
Jetzt erhalten wir beim Start das vertraute Windows Explorer-Fenster mit einer praktischen Auswahl der erforderlichen Dateien:
Weitere Informationen zum Arbeiten mit dem Dialogfeld zum Öffnen von Dateien finden Sie in der
offiziellen Dokumentation . Wer mehr über die PowerShell-Benutzeroberfläche erfahren möchte, kann problemlos viel Material im Netzwerk finden. Es gibt sogar einen
Online-Formular-Designer .
Die Ausnahmebehandlung in der zweiten Option wurde seitdem entfernt Die interaktiven Benutzerinformationen wurden dem Dirigenten und dem Notizblock überlassen.
Wenn Sie den Code über ISE ausführen, wird das Dialogfeld zur Dateiauswahl im Hintergrund angezeigt (
Strg + Tab zur Unterstützung), aber über die Befehlszeile funktioniert alles wie erwartet. Beachten Sie auch, dass die
ShowHelp- Eigenschaft
$ true sein muss, um
diesen Fehler zu
umgehen .
Ich möchte auch auf die
InitialDirectory- Eigenschaft aufmerksam machen. Die Obergrenze gibt an, dass der Pfad zum Ordner festgelegt wird, der beim Starten des Skripts standardmäßig ausgewählt wird. Da sich der Explorer jedoch den zuletzt ausgewählten Speicherort „merkt“, den der Benutzer im Dialogfeld zur
Dateiauswahl angegeben hat, kann
InitialDirectory nur beim ersten Ausführen des Skripts hilfreich sein.
Option 2 war für unsere Benutzer vollständig geeignet, daher haben wir damit aufgehört. Wenn Sie jedoch eine Option mit Interaktivität für
Damen und Präferenzen sowie eine andere Sortierung als den Namen benötigen (z. B. nach dem Änderungsdatum), ist dies ebenfalls möglich. Wir bekommen
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 }
Weil Parameter wie Dateigröße oder Erstellungsdatum können nicht direkt aus dem
$ OpenFileDialog- Objekt
extrahiert werden. Anschließend verwenden wir das Cmdlet
Get-ChildItem , um eine Liste aller Dateien in dem vom Benutzer ausgewählten Ordner abzurufen, und belassen dann nur die vom Benutzer ausgewählten und sortierten Dateien sie in der Form, die wir brauchen.
Wir geben in der Produktion

Nachdem Sie sichergestellt haben, dass alles ordnungsgemäß funktioniert, legen Sie das Skript in einem Netzwerkordner ab und zeigen Sie den Benutzern eine Verknüpfung zum Desktop an.
Und damit unser kleines wehrloses Skript nicht durch die bösen
Ausführungsrichtlinien beleidigt wird, verstecken wir es in einer solchen Hülle:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File "\\server\share\Scripts\BulkPrint.ps1"
Oder Sie können eine warme Röhrchen-Batch-Datei
einwickeln .
In einer Unternehmensumgebung können unter anderem
strenge Richtlinien für Softwareeinschränkungen und rücksichtsloser
AppLocker sowie andere Sicherheitssoftware den
Skriptstart beeinträchtigen. Dies geht jedoch über den Rahmen dieses Artikels hinaus.
Sie können Glanz hinzufügen, indem Sie ein schönes Symbol für die Verknüpfung festlegen. Ich habe folgendes gewählt:
Wenn unser Skript viele Benutzer enthält, können Sie die Verknüpfung mithilfe der
Gruppenrichtlinieneinstellungen massiv verteilen.
Zusammenfassung

Dies geschieht, wenn es ohne vorherige Prüfung eingeführt wird.
Und wir werden so haben:

Und schließlich aufrührerischer Gedanke: Was ist, wenn Sie in eine andere Richtung denken und statt allem, was oben beschrieben wurde, mit den Vorgesetzten kommunizieren und den Arbeitsprozess neu organisieren?
