[Keith Vetter] 2003-09-10: Today I wanted to print a simple text from within tcl. I thought it should be easy--it is just ''exec notepad /p myfile.txt''. But to do it properly turned out to be quite difficult. I'll explain why, but the ultimate command you need to executes is this: exec c:/winnt/system32/cmd.exe /c start /min c:/winnt/system32/notepad /p myfile.txt First off, you need to look in the registry and find the print command for text files: package require registry set app [registry get {HKEY_CLASSES_ROOT\.txt} {}] set pcmd [registry get HKEY_CLASSES_ROOT\\$app\\shell\\print\\command {}] NB. pcmd => %SystemRoot%\system32\NOTEPAD.EXE /p %1 Now put our file name for ''%1''. set fname myfile.txt regsub -all {%1} $pcmd [file normalize $fname] pcmd NB. pcmd => %SystemRoot%\system32\NOTEPAD.EXE /p c:/temp/myfile.txt So far so good, but now when I try to ''exec''ute it there are two problems. First, the ''%SystemRoot%'' needs to be handled, and second, the notepad window flashes momentarily. Luckily, both problems can be handled by simply using '''start /min''' to run the command. set command "[auto_execok start] /min $pcmd" exec $command & '''WRONG''' -- this needs to be broken into words with ''eval'' eval exec $command & '''WRONG''' -- the backslashes in $pcmd are doubly interpreted set command "[auto_execok start] /min [regsub -all {\\} $pcmd {\\\\}]" eval exec $command & '''YEAH!''' (and don't try replacing the backslashes with forward slashes or 4DOS/4NT won't work) Putting it all together, here's a short procedure to print a text file on windows (w/ no error checking and tested only on Win2k): proc PrintText {fname} { package require registry set app [registry get {HKEY_CLASSES_ROOT\.txt} {}] set pcmd [registry get HKEY_CLASSES_ROOT\\$app\\shell\\print\\command {}] regsub -all {%1} $pcmd [file normalize $fname] pcmd set command "[auto_execok start] /min [regsub -all {\\} $pcmd {\\\\}]" eval exec $command & } ---- This will not work on W2k, if pcmd contains spaces, and is quoted with "", as start will interpret it as the window title. (it works on Win9x). Adding a "" to the command line helps. [KPV] could you explain your fix more. Or perhaps you could insert a dummy window title. [HZe] I have had similar problems with the command start and the usage of quotes "". The most robust solution I found is to convert all filenames to Windows shortnames by set filename [file attribute $filename -shortname] and don't include it in quotes. Otherwise I didn't get it to work on Windows NT, 2000 and XP. ---- See also: [Tcl 9.0 WishList] - #66. ---- [AM] [kroc] informed me about yet another utility that is available for this type of things: [http://www.pcounter.com/printraw.html]. Typical usage: [catch [ list exec printraw.exe [file nativename [file join $dir spoolout *.prn]] $printername ]] [KPV] But the whole point of the above exercise was to ask the Windows OS how to print a text file. Theorectically it should work regardless of which utility is present or not. ---- Category ???