PDA

Показать полную графическую версию : печать из буфера


cher
19-06-2011, 21:33
есть в буфере текст.в текстовый документ его вставлять неохота/неинтересно...
как из cmd вывести на печать на принтер по умолчанию в количестве 1 копии?
так чтоб "запоминаемо" было.
длинный скрипт ниасилю :)

Iska
19-06-2011, 22:19
cher, чистый текст, неформатированный?

cher
19-06-2011, 22:21
Iska, да.

ferget
19-06-2011, 22:27
http://soft.oszone.net/program/7092/NirCmd

и вот

http://forum.oszone.net/thread-150063.html

cher
19-06-2011, 22:39
ferget, а внаглую без использования сторонних утилит и без замысловатого варианта во второй ссылке?

ferget
19-06-2011, 22:46
нет в cmd инструмента для работы с буфером обмена

cher
19-06-2011, 22:50
нет в cmd инструмента для работы с буфером обмена »
:o блин... вроде чисто интуитивно должно быть...
т.е в любом случае надо создавать txt. а это полностью снимает вопрос темы :(

-а если вставить текст в cmd? не прокатит?

ferget
20-06-2011, 00:07
есть такое

echo ZZZZ > prn:

но вроде надо принтер настраивать

Iska
20-06-2011, 00:39
нет в cmd инструмента для работы с буфером обмена »
Вроде как в Vista+ есть: «clip.exe» (в более ранних входил в состав «Resource Kit'ов»), но для помещения в буфер обмена.

Можно попробовать использовать получение содержимого буфера обмена посредством «mshta.exe»: CMD/BAT: использование mshta.exe (http://forum.script-coding.com/viewtopic.php?id=2369), перенаправление во временный файл, печать и удаление временного файла. Например:
@echo off
setlocal

call :TempFileName

MSHTA.EXE "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();" 1>"%TempFileName%"
notepad.exe /p "%TempFileName%"
del "%TempFileName%"

endlocal
exit /b 0

rem ==========================================================================
rem Функция TempFileName()
rem ==========================================================================
:TempFileName
setlocal enableextensions enabledelayedexpansion

:NextName
set sTempFileName=%temp%\temp%random%.tmp

if exist %sTempFileName% goto :NextName

set sProcName=%~0

endlocal & set %sProcName:~1%=%sTempFileName%
exit /b 0
rem ==========================================================================

amel27
20-06-2011, 06:40
есть такое
echo ZZZZ > prn:
но вроде надо принтер настраивать »перенаправить локальный порт (LPT1) на сетевой принтер через NET USE

если установлен .NET
батник "компилируется" в EXE (сабж)
for /f "delims=" %%a in ('dir /s/a-d/b/od "%windir%\Microsoft.NET\Framework\vbc.exe"') do set "vbc=%%a"
(echo Imports System.IO
echo Imports System.Drawing.Printing
echo Imports System.Runtime.InteropServices
echo Module Test
echo ^<StructLayout^(LayoutKind.Sequential, CharSet:=CharSet.Unicode^)^> Structure DOCINFOW
echo ^<MarshalAs^(UnmanagedType.LPWStr^)^> Public pDocName As String
echo ^<MarshalAs^(UnmanagedType.LPWStr^)^> Public pOutputFile As String
echo ^<MarshalAs^(UnmanagedType.LPWStr^)^> Public pDataType As String
echo End Structure
echo ^<DllImport^("winspool.Drv",EntryPoint:="OpenPrinterW",SetLastError:=True,CharSet:=CharSet.Unicode,ExactSpelling:=True,CallingConvention:=CallingConventio n.StdCall^)^> Public Function OpenPrinter^(ByVal src As String,ByRef hPrinter As IntPtr,ByVal pd As Long^) As Boolean
echo End Function
echo ^<DllImport^("winspool.Drv",EntryPoint:="ClosePrinter",SetLastError:=True,CharSet:=CharSet.Unicode,ExactSpelling:=True,CallingConvention:=CallingConventio n.StdCall^)^> Public Function ClosePrinter^(ByVal hPrinter As IntPtr^) As Boolean
echo End Function
echo ^<DllImport^("winspool.Drv",EntryPoint:="StartDocPrinterW",SetLastError:=True,CharSet:=CharSet.Unicode,ExactSpelling:=True,CallingConvention:=CallingConventio n.StdCall^)^> Public Function StartDocPrinter^(ByVal hPrinter As IntPtr,ByVal level As Int32,ByRef pDI As DOCINFOW^) As Boolean
echo End Function
echo ^<DllImport^("winspool.Drv",EntryPoint:="EndDocPrinter",SetLastError:=True,CharSet:=CharSet.Unicode,ExactSpelling:=True,CallingConvention:=CallingConventio n.StdCall^)^> Public Function EndDocPrinter^(ByVal hPrinter As IntPtr^) As Boolean
echo End Function
echo ^<DllImport^("winspool.Drv",EntryPoint:="StartPagePrinter",SetLastError:=True,CharSet:=CharSet.Unicode,ExactSpelling:=True,CallingConvention:=CallingConventio n.StdCall^)^> Public Function StartPagePrinter^(ByVal hPrinter As IntPtr^) As Boolean
echo End Function
echo ^<DllImport^("winspool.Drv",EntryPoint:="EndPagePrinter",SetLastError:=True,CharSet:=CharSet.Unicode,ExactSpelling:=True,CallingConvention:=CallingConventio n.StdCall^)^> Public Function EndPagePrinter^(ByVal hPrinter As IntPtr^) As Boolean
echo End Function
echo ^<DllImport^("winspool.Drv",EntryPoint:="WritePrinter",SetLastError:=True,CharSet:=CharSet.Unicode,ExactSpelling:=True,CallingConvention:=CallingConventio n.StdCall^)^> Public Function WritePrinter^(ByVal hPrinter As IntPtr,ByVal pBytes As IntPtr,ByVal dwCount As Int32,ByRef dwWritten As Int32^) As Boolean
echo End Function
echo Sub Main^(^)
echo Dim ps As New System.Drawing.Printing.PrinterSettings
echo Dim szPrinter As String = PS.PrinterName
echo Dim szString As String = My.Computer.Clipboard.GetText
echo Dim dwCount As Int32 = szString.Length^(^)
echo Dim pBytes As IntPtr = Marshal.StringToCoTaskMemAnsi^(szString^)
echo Dim di As DOCINFOW
echo di.pDocName="Clipboard RAW Printing"
echo di.pDataType = "RAW"
echo Dim hPrinter As IntPtr
echo Dim dwWritten As Int32
echo If OpenPrinter^(szPrinter,hPrinter,0^) Then
echo If StartDocPrinter^(hPrinter,1,di^) Then
echo If StartPagePrinter^(hPrinter^) Then
echo WritePrinter^(hPrinter,pBytes,dwCount,dwWritten^)
echo EndPagePrinter^(hPrinter^)
echo End If
echo EndDocPrinter^(hPrinter^)
echo End If
echo ClosePrinter^(hPrinter^)
echo End If
echo Marshal.FreeCoTaskMem^(pBytes^)
echo End Sub
echo End Module
)>"%~n0.tmp"
"%vbc%" "%~n0.tmp" /out:"%~n0.exe"
del "%~n0.tmp" "%~f0"& exit
источник: How to send raw data to a printer by using Visual Basic .NET (http://support.microsoft.com/kb/322090/en-us)




© OSzone.net 2001-2012