Практически все сталкивались с ситуацией, когда нужно распечатать несколько документов сразу, не открывая их. Например, по электронной почте вышестоящая организация прислала распоряжения, инструкции, примеры, шаблоны — все их нужно распечатать. И если открывать каждый файл и в каждом файле нажимать печать, то уходит много времени.
Если вы точно уверены, что все файлы нужно печатать, то это можно сделать прямо из папки, не открывая каждый файл.
Обратите внимание, что распечатать одновременно можно только файлы одного типа — только .pdf, только .docx, только .jpg и т.д.
Шаг 1
Открываем папку, в которой хранятся файлы, которые нужно распечатать одновременно (или предварительно копируем файлы в такую папку).
Нажмите для увеличения
Далее выделяем нужные файлы. Если файлы расположены друг за другом то можно выделить так: щелкнуть мышью на первый файл в списке и, нажать клавишу SHIFT и, удерживая клавишу, щелкнуть по последнему файлу в списке. Таким образом мы выделим все файлы от какого-то до какого-то.
Если нужно выделить файлы вразброс или из ранее выделенного блока файлов удалить пару, то нужно нажать на клавиатуре клавишу CTRL и, удерживая ее, мышкой щелкать по тем файлам, которые нужно выделить. Так будет происходить выделение поштучно.
Если что-то выделили лишнего, то можно просто еще раз щелкнуть по этому файлу для снятия выделения.
Если случайно скопировали все файлы (их стало по 2), то отменить копирование можно клавиатурной комбинацией CTRL + Z (отмена последнего действия) и подтвердить удаление лишних файлов.
Шаг 2
После того как все файлы одного типа, которые нужно распечатать, выделены, нужно нажать правую кнопку мыши на выделенном — Печать.
Так же в точности можно распечатать и файлы другого типа.
Спасибо за Вашу оценку. Если хотите, чтобы Ваше имя
стало известно автору, войдите на сайт как пользователь
и нажмите Спасибо еще раз. Ваше имя появится на этой стрнице.
Порядок вывода комментариев:
Время на прочтение6 мин
Количество просмотров46K
Иногда нужно быстро распечатать много
картинок с котиками
документов, а открывать для этого каждый файл совсем не хочется. Первым делом напрашивается использование контекстного меню проводника, но у этого способа есть свои ограничения и нюансы. Поэтому пришлось искать альтернативу. За подробностями — прошу под кат.
Анализируем ситуацию и собираем данные
Тема пакетной печати не раз освещалась в
трудах великих учёных
интернет-статьях. Например, в этой и этой.
Мы же начнем с выяснения того, какой функционал нужен конечным пользователям. В результате общения с коллегами получися такой список:
- печатать нужно только XML-файлы;
- форматирование для XML не требуется;
- на бумаге, помимо содержимого, должно быть указано и имя печатаемого файла;
- файлы должны быть отсортированы по имени, чтобы было удобно подшивать бумажные листы в архив.
Пожалуй, самым простым и очевидным видится печать из контекстного меню проводника, о чем можно почитать тут и здесь. По второй ссылке дана информация по удалению пункта «Печать» для определенных типов файлов, но сообразительный читатель легко поймет из нее, как, наоборот, можно добавить недостающее.
Но у такого способа есть, как минимум, два недостатка:
- нельзя напечатать больше 15 файлов за раз;
- файлы печатаются в случайном порядке (возможно, логика все же есть, но я ее не нашел), а не так, как они отсортированы в проводнике.
Первый недостаток легко устраним твиком реестра. Для решения второго есть рекомендации в виде танцев с бубном, но в нашей среде боги суровы и эти обряды не помогли.
Есть готовые сторонние решения (ссылки на статьи с информацией о них даны выше). Но при коммерческом использовании за эти продукты придется заплатить, к тому же всегда приятно
забить элегантный костыль и изобрести очередной велосипед
сделать что-то своими руками.
Выбираем инструмент и разрабатываем решение
Примечание. Чтобы не переводить бумагу, на этапе подготовки и тестирования скрипта удобно использовать виртуальный принтер. Меня устроил штатный Microsoft XPS Document Writer, но есть еще PDF24 Creator, doPDF, CutePDF Writer — как говорится, на вкус и цвет…
В качестве языка был выбран PowerShell. В базовой комплектации скрипт выглядит так:
Вариант 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
}
Печать выполняется средствами штатного блокнота Windows (чтоб не простаивал без дела).
Как видно из 3-й строки, сортировка в примере происходит по имени файла (Name). Вместо этого можно взять за основу размер (Length) или дату изменения (LastWriteTime). Если вам требуется что-то более экзотичное, можно зайти сюда.
Для сортировки в обратном порядке у командлета Sort-Object есть ключ -Descending.
В этом варианте печать идет на принтер по умолчанию, и нас такое поведение устроило. Если же нужно печатать на принтер, отличный от дефолтного, у блокнота есть параметр /PT.
Соответственно, код примет следующий вид:
<...>
$PrinterName = "\\server2\Network Printer"
<...>
Start-Process -FilePath notepad -ArgumentList ("/PT `"$PrinterName`" `"" + $_.FullName + "`"") -Wait
<...>
Аналогично вместо блокнота можно поэксплуатировать любую другую программу в зависимости от того, какой формат файлов нужно печатать. Главное — чтобы она поддерживала печать через интерфейс командной строки.
Примечание. Если будете приручать Adobe Reader, имейте в виду этот старый баг. В нашем окружении он все еще проявляется, возможно, вам повезет больше. А еще есть хорошая статья, посвященная печати PDF из PowerShell.
Если же вам на выходе нужен только «голый» текст из обычного текстовика, то 5-я строка варианта 0 примет такой вид:
Get-Content $_.FullName | Out-Printer -Name $PrinterName
Для печати на дефолтный принтер параметр -Name нужно опустить.
Для нашей задачи требовалась печать файлов из нескольких расположений. Немного дополнив вариант 0, получаем
Вариант 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 для завершения"
}
Для приличия добавлена функция обработки исключений. И в случае, если, например, папка, из которой печатаются файлы, стала недоступной, то выполнение печати прервется и пользователю будет выведено соответствующее уведомление. Кстати, замечено, что блокнот возвращает в exit-коде 0 даже при попытке распечатать несуществующий/недоступный файл, но в GUI при этом ругается.
Опробовав вариант 1, пользователи попросили дать возможность выбора папки и конкретных файлов в ней, поэтому было добавлено немного интерактивности в виде диалогового окна выбора файлов. Так появился
Вариант 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
}
Теперь при запуске получаем привычное окно проводника Windows с удобным выбором нужных файлов:
клик
Подробнее о работе с диалоговым окном открытия файлов можно почитать в официальной документации, а кто хочет узнать больше про GUI-зацию PowerShell, легко найдет много материала в сети, есть даже онлайн-конструктор форм.
Обработка исключений во втором варианте была убрана, т.к. интерактивное информирование пользователя было отдано на откуп проводнику и блокноту.
При запуске кода из ISE диалоговое окно выбора файлов выводится на заднем плане (Ctrl+Tab в помощь), но из командной строки все работает как положено. Также обратите внимание, что свойство ShowHelp должно быть $true, чтобы обойти этот баг.
Еще хотелось бы обратить внимание на свойство InitialDirectory. Кэп подсказывает, что оно определяет путь к папке, которая будет выбрана по умолчанию при запуске скрипта. Но, учитывая, что проводник «запоминает» последнее выбранное расположение, которое было указано пользователем в диалоге выбора файлов, InitialDirectory может пригодиться только при первом запуске скрипта.
Вариант 2 полностью подошел нашим пользователям, поэтому на нем мы и остановились. Но если вам нужен вариант с
дамами и преферансом
интерактивностью и сортировкой, отличной от имени (например, по дате изменения), это тоже реализуемо. Получаем
Вариант 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
}
Т.к. из объекта $OpenFileDialog нельзя напрямую извлечь такие параметры, как размер или дату создания файла, то мы с помощью командлета Get-ChildItem получаем список всех файлов в папке, выбранной пользователем, а потом оставляем только те из них, которые были выбраны пользователем, и сортируем их в нужном нам виде.
Отдаем в продакшн
Убедившись, что всё работает как надо, кладем скрипт в сетевую папку и выводим пользователям ярлык на рабочий стол.
А чтобы наш маленький беззащитный скрипт не обижали злые Execution Policies, прячем его в такую скорлупу:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File "\\server\share\Scripts\BulkPrint.ps1"
клик
Или можно обернуть в теплый ламповый батник.
Среди прочего, в корпоративной среде запуску скрипта могут мешать суровые Software Restriction Policies и безжалостный AppLocker, а также другое защитное ПО, но это уже выходит за рамки статьи.
Можно добавить лоска, установив красивый значок для ярлыка. Я выбрал такой:
клик
Если пользователей нашего скрипта много, можно массово раздать ярлык с помощью предпочтений групповой политики.
Итог
Такое бывает, если выкатить без предварительного тестирования.
А у нас будет вот так:
И крамольная мысль напоследок: а что, если подумать в другом направлении и вместо всего описанного выше пообщаться с начальством и перестроить рабочий процесс?
В сегодняшнем пost, мы рады поделиться с вами двумя быстрыми способами пакетной печати нескольких документов Word одновременно.
В документе трудно не говорить о печати. Обычно мы открываем документ и печатаем его отдельно один за другим. Это может быть приемлемо, когда файлов всего несколько. Однако, говоря о большом количестве документов, мы должны придумать более быстрые решения, а не открывать и печатать каждый вручную.
Ниже приведены 2 доступных метода пакетной печати нескольких документов Word.
Способ 1: печать через контекстное меню
- Начнем с того, что если вы не любите выбирать документы во время печати, вы можете расположить их все в одном каталоге.
- Затем посетите место, где вы храните tarполучить документы.
- Нажмите «Ctrl + A», чтобы выбрать все документы.
- Щелкните правой кнопкой мыши и выберите «Печать».
Картинка с сайта: www.datanumen.com
Кстати, с помощью этого метода вы можете распечатать максимум 15 документов каждый раз.
Способ 2: Пакетная печать документов через VBA
Так как метод 1 имеет ограничение числа до 15, вы можете выбрать способ макроса, чтобы обойти ограничение.
- Первый и первыйost, организовать все tarполучить файлы в той же папке.
- Затем нажмите вкладку «Разработчик» и затем «Visual Basic». Если вкладки «Разработчик» еще нет на ленте, вместо этого нажмите «Alt + F11», чтобы вызвать редактор VBA.
Картинка с сайта: www.datanumen.com
Sub BatchPrintWordDocuments() Dim objWordApplication As New Word.Application Dim strFile As String Dim strFolder As String strFolder = InputBox("Введите адрес папки", "Адрес папки", "Например: E:\test word\test\") strFile = Dir(strFolder & "*.doc*", vbNormal) While strFile <> "" With objWordApplication .Documents.Open (strFolder & strFile) .ActiveDocument.PrintOut .ActiveDocument.Close End With strFile = Dir() Wend Set objWordApplication = Ничто не заканчивается
- И последнее, но не менее важное: нажмите кнопку «Выполнить» или нажмите «F5».
Картинка с сайта: www.datanumen.com