Ordnernamen drucken, rechte Maustaste

guru1d

Cadet 4th Year
Registriert
Apr. 2015
Beiträge
87
Hallo,

wie stellt man es am besten an. Das ein Ordnername nach eine bestimmten Formatierung ausgedruckt wird?

Bisher erfolgt es umständlich über eine Vorlage in Word, wo der Ordnername manuell gestückelt wird, damit der Andruck an die richtige Stelle erfolgt (Etikettendruck...).

Namensstruktur der Ordner:
ID" - "Name" - "Betreff

automatischer Ausdruck auf bestimmten Drucker (immer derselbe Drucker).
Formatierung (und Ausrichtung) für jedes " - " ein Zeilenumbruch (wichtig Name oder Betreff können auch "-" enthalten, dann aber sind die "-" nicht von Leerzeichen umgeben )
->
ID
Name
Betreff

Vielen Dank.
 
So richtig klar ist mir Deine Anfrage nicht, aber ich würde mal sagen, hast Du versucht, Word "Mail Merge" zu benutzen? tut mir leid ich habe keine Deutsche Version aber hier ist das zu finden:
https://i.imgur.com/lZOdF5Y.png

Die Importdatei könnte man mit einem recht einfachen CMD script erstellen.

Rechte Maustaste.. ist mir jetzt nicht klar. Solltest Du das Kommando im "Rechte Maustaste" menu haben wollen, da gibt es bestimmt freeware die sowas machen kann.
 
Die Anforderung, den Ordnernamen auszulesen, aufzuteilen und zu drucken : hört sich banal an, hat es trotzdem etwas in sich. Schlage jetzt mal autoit vor. Da hab ich mal auf die Schnelle was zusammengebastelt:
Code:
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <WINAPI.au3>
#include <Process.au3>
#include <GUIListView.au3>
#include <Array.au3>
#include <FileConstants.au3>
#include <File.au3>

; mit STRG und < wird Skript gestartet
HotKeySet ("^<", "gettext")

Local $clipboard

While 1
WEnd


Func gettext ()
;Ordnername bei aktueller Position auslesen und in Zwischenablage übernehmen
send("{F2}")
send ("^c")
send("{ESC}")

;Inhalt Zwischenablage aufteilen
$sText = ClipGet ()
$aArray = StringSplit($sText, ' - ', $STR_ENTIRESPLIT)

For $i = 1 To $aArray[0]
;  MsgBox($MB_SYSTEMMODAL, "", $aArray[$i])
Next

;Erstellen einer temporären Datei und Windows-Temp
$sFileName = @TempDir &"\Test.txt"
$hFilehandle = FileOpen($sFileName, $FO_OVERWRITE)

;temporäre Datei mit ausgelesen Dateien fütter.
;Formatierung wie folgt:
;array 1                   ;ID
; 5 Leerzeichen array 2    ;5 Leerzeichen Name
;2x carriage return        ;Leerzeile
;array 3                   ;Betreff

FileWrite($hFilehandle, _
$aArray[1] _
& @CRLF & _
"     " & $aArray[2] _
& @CRLF & @CRLF & _
$aArray[3])

;temporäre Datei drucken
$sFilePath = @TempDir &"\Test.txt"
$iIsPrinted = _FilePrint($sFilePath)

EndFunc
Es läuft wie folgt ab:
-Skript kompilieren & starten
-Den Ordner im Format 123 - Name1 - Betreff1 mit der linken Maustaste markieren
-Skript wird mit STRG und < (die Taste schräg rechts über STRG) gestartet
-Der markierte Ordner wird in die Zwischenablage kopiert (F2 und STRG+C)
-String wird in Array1, Array2, Array3 aufgeteilt
-Es wird im Windows-Temp-Ordner eine Datei Test.txt erstellt
-Die Werte von Array1-3 werden in die Textdatei samt Formatierung kopiert (da muß man mit @CRLF und Leerzeichen rumprobieren, damit es mit den Etiketten zusammenpasst)
-Die Test.txt wird auf den Standard-Drucker ausgegeben.
 
Hallo,

vielen Dank für die Hilfe. Ich probiere es aus :).

Ziel ist es wie gesagt Etiketten zu drucken. Also 1 Ordner = 1 Vorgang -> 1 Etikett

Ist es möglich das Script ins rechte Maus Kontext menu zu packen. So dass es immer den Ordner druckt den man angeklickt hat?

Ist es auch Möglich die Test.txt immer auf einem bestimmgen Drucker automatisch zu drucken?

Danke
 
Zuletzt bearbeitet:
@ guru1d
Mit dem Drucker müsste man etwas tricksen.
Folgendes Skript ändert den Standard-Drucker auf ein bestimmtes Gerät ab.
Ändert am Schluß wieder auf das andere Gerät zurück.
Da bitte die beiden Variablen entsprechend im Format "\\Server\Freigabename_des_Druckers" anpassen
Code:
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <WINAPI.au3>
#include <Process.au3>
#include <GUIListView.au3>
#include <Array.au3>
#include <FileConstants.au3>
#include <File.au3>

;Neuer Drucker
$NeuerDrucker = "\\SERVER\Freigabename_des_neuen_Druckers"
$WshNetwork =  ObjCreate("WScript.Network")
$WshNetwork.AddWindowsPrinterConnection ($NeuerDrucker)
Run(@ComSpec & " /c RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n " & $NeuerDrucker , "",@SW_HIDE)

Local $clipboard

;Ordnername bei aktueller Position auslesen und in Zwischenablage übernehmen
send("{F2}")
send ("^c")
send("{ESC}")

;Inhalt Zwischenablage aufteilen
$sText = ClipGet ()
$aArray = StringSplit($sText, ' - ', $STR_ENTIRESPLIT)

For $i = 1 To $aArray[0]
;  MsgBox($MB_SYSTEMMODAL, "", $aArray[$i])
Next

;Erstellen einer temporären Datei und Windows-Temp
$sFileName = @TempDir &"\Test.txt"
$hFilehandle = FileOpen($sFileName, $FO_OVERWRITE)

;temporäre Datei mit ausgelesen Dateien fütter.
;Formatierung wie folgt:
;array 1                   ;ID
; 5 Leerzeichen array 2    ;5 Leerzeichen Name
;2x carriage return        ;Leerzeile
;array 3                   ;Betreff

FileWrite($hFilehandle, _
$aArray[1] _
& @CRLF & _
"     " & $aArray[2] _
& @CRLF & @CRLF & _
$aArray[3])

;temporäre Datei drucken
$sFilePath = @TempDir &"\Test.txt"
$iIsPrinted = _FilePrint($sFilePath)

;Alter Drucker
$AlterDrucker = "\\SERVER\Freigabename_des_alten_Druckers"
$WshNetwork =  ObjCreate("WScript.Network")
$WshNetwork.AddWindowsPrinterConnection ($AlterDrucker)
Run(@ComSpec & " /c RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n " & $AlterDrucker , "",@SW_HIDE)

Das Skript als Etikett_drucken.exe kompilieren und nach C:\Program Files (x86) kopieren

-regedit.exe starten
-nach HKEY_CLASSES_ROOT\Directory\shell\ navigieren
-dort einen Schlüssel Etikett_drucken erstellen
-dort wiederum einen Schlüssel command erstellen
-bei (Standard) dann hinterlegen : C:\Program Files (x86)\Etikett_drucken.exe

Jetzt kommt bei rechter Maustaste der Menüeintrag Etikett_drucken. Einfach über betroffenen Ordner rechte Maustaste und Menüeintrag wählen
 

Anhänge

  • eintrag_rechte_maustaste_registry.gif
    eintrag_rechte_maustaste_registry.gif
    14,5 KB · Aufrufe: 354
@ryan_blackdrago

Dank Deiner ausführlichen Anleitung konnte ich das Skript erstellen und prinzipielles Drucken klappt auch schon.

Stehe noch vor folgenden Problemen:

1) Den Text in Schriftart Arial 12 zu formatieren

2) Ausrichtung mittig. Bekommt man das überhaupt hin? (oder müsste man doch irgendwie über eine Word datei gehen, an die die Variablen übergeben werden?)

ID
Name
Betreff

Das Papier welches ich einlege ist ca. 105 mm breit.

Die Höhe anpassen dank Deiner Vorarbeit mit dem "@CRLF" klappt auch.

3) Wie kann ich die Druckernamen richtig einpflegen? Also wo kann ich diese sehen? Wenn ich auf den Druckbereich in Windows gehe, sehe ich bei den Netzwerkdruckern nur die \\Server\ ip aber nicht den richtigen Druckernamen.
Bisher habe ich die Befehle zum Druckerwechsel auskommentiert.

Habe es auch nicht hinbekommen über CMD eine Auflistung der Drucker zu bekommen.

Vielen Dank.
 
zu 1)
Ja, ist möglich. Da müsste man allerdings einen anderen Weg gehen, da das Textfile-Format nur bedingt Schriftart und Schriftgröße unterstützt

zu 2)
möglich. Kannst Du mal wordpad (nicht Word!) starten und ein entsprechendes Standard-Dokument erstellen (wo ID, Name und Betreff an der richtigen Stelle sind) und diese dann im .rtf-Format hier hochladen

zu 3)
Start > Ausführen > dort \\Server-IP eingeben > es erscheint eine Auflistung aller Drucker. Dort den Namen des Druckers notieren. Im Skript geht dann auch \\Server-IP\Name-des-Druckers
 
danke :)

1) + 2) hier die rtf Datei

3) Danke. Den normalen Netzwerkdrucker konnte ich so finden, bisher aber noch nicht den MFC Fax-Drucker. Werde es aber noch herausbekommen.
 

Anhänge

  • Druck.zip
    3,3 KB · Aufrufe: 356
@ guru1d
Gemäß der hochgeladenen Druck.zip ergeben sich folgende Formatierungen im .rtf-Format:
Zeile 1 bis 9 in Arial 10 ; Zeile 10 bis 13 in Arial 12 ; Zeile 14 bis 24 in Arial 10.

Diesen Link öffnen > die Datei RTF_writer.au3 herunterladen > die Datei nach "C:\Program Files (x86)\AutoIt3\Include" kopieren (Pfade entsprechend der Installation beachten).

Der folgende Code liest den Ordner (im Format Text - Text - Text) an der aktuellen Mausposition aus > schreibt diese Infos in eine .rtf-Datei > Formatiert die .rtf-Datei > Wechselt den Drucker > Druckt die Datei > Wechselt den Drucker zurück:
Code:
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <WINAPI.au3>
#include <Process.au3>
#include <GUIListView.au3>
#include <Array.au3>
#include <FileConstants.au3>
#include <File.au3>
#include <RTF_writer.au3>

FileDelete(@TempDir & "\Test.rtf")
FileDelete(@TempDir & "\Test2.rtf")

;Neuer Drucker
$NeuerDrucker = "\\printserver\freigabename_neuer_Drucker"
$WshNetwork =  ObjCreate("WScript.Network")
$WshNetwork.AddWindowsPrinterConnection ($NeuerDrucker)
Run(@ComSpec & " /c RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n " & $NeuerDrucker , "",@SW_HIDE)
sleep(100)

Local $clipboard

;Ordnername bei aktueller Position auslesen und in Zwischenablage übernehmen
send("{F2}")
send ("^c")
send("{ESC}")

;Inhalt Zwischenablage aufteilen
$sText = ClipGet ()
$aArray = StringSplit($sText, ' - ', $STR_ENTIRESPLIT)

For $i = 1 To $aArray[0]
;  MsgBox($MB_SYSTEMMODAL, "", $aArray[$i])
Next

;Erstellen einer temporären Datei und Windows-Temp
$sFileName = @TempDir &"\Test.rtf"
$hFilehandle = FileOpen($sFileName, $FO_OVERWRITE)

$temp=_RTFCreateDocument("Arial")
$temp = _RTFAppendString($temp,  chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11), 0, 10, 0, "Arial")
$temp = _RTFAppendString($temp,  chr(11), 0, 12, 0, "Arial")
$temp = _RTFAppendString($temp,  $aArray[1] , 0, 12, 0, "Arial")
$temp = _RTFAppendString($temp,  chr(11) , 0, 12, 0, "Arial")
$temp = _RTFAppendString($temp,  $aArray[2] , 0, 12, 0, "Arial")
$temp = _RTFAppendString($temp,  chr(11) , 0, 12, 0, "Arial")
$temp = _RTFAppendString($temp,  $aArray[3] , 0, 12, 0, "Arial")
$temp = _RTFAppendString($temp,  chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11) & chr(11)& chr(11) & chr(11)& chr(11), 0, 10, 0, "Arial")
FileWrite( @TempDir & "\Test.rtf",$temp)

FileCopy("C:\Temp\Test.rtf", @TempDir & "\Test2.rtf")


Global $programm1 = "C:\Program Files\Windows NT\Accessories\wordpad.exe"
Global $file1 = @tempdir & "\Test2.rtf"
Run($programm1 & " " & $file1)

WinWaitActive("Test2.rtf - WordPad", "Ribbon")
WinWait("Test2.rtf - WordPad", "Ribbon")

BlockInput(1)

Send("^a")
Send("^e")
Send("^s")
Send("!{F4}")

Blockinput(0)

;temporäre Datei drucken
$sFilePath = @TempDir &"\Test2.rtf"
$iIsPrinted = _FilePrint($sFilePath)

;Alter Drucker
$AlterDrucker = "\\printserver\freigabename_alter_Drucker"
$WshNetwork =  ObjCreate("WScript.Network")
$WshNetwork.AddWindowsPrinterConnection ($AlterDrucker)
Run(@ComSpec & " /c RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n " & $AlterDrucker , "",@SW_HIDE)
 
@ryan_blackdrago

vielen Dank!!!

Konnte es gerade ausprobieren. Leider habe ich 2 Probleme.
Der Virenscanner (Avira) springt an HEUR/APC (Cloud).

Wenn ich das File dann erlaube und ausführe kommt in Wordpad die Fehlermeldung dass die Datei "Test2.rtf" nicht gefunden werden kann.

Im temp Ordner sehe ich auch nur die Test.rtf. Wenn ich testweise das löschen der rtf rausnehme und die Test.rtf und Test2.rtf manuell erstelle, dann klappt es soweit ich es sehe.

Vielen Dank :)
 
Zurück
Oben