Как вызвать глагол для нескольких файлов
Используя PowerShell, я хотел бы вызвать глагол печати для нескольких файлов. В проводнике Windows я могу зайти в папку, выбрать несколько файлов, щелкнуть правой кнопкой мыши и выбрать параметры печати. Откроется диалоговое окно "Печать изображений" со всеми выбранными файлами. Я могу сделать это для одного файла, используя:
$path = "C:\person.jpg";
Start-Process -FilePath $path -Verb Print | Out-Null;
Start-Sleep -s 150;
Но было интересно, как я мог сделать это для ряда файлов.
2 ответа
Вы можете использовать COM для вызова глагола для нескольких файлов за одну операцию.
Предполагая, что...
$folderPath = 'X:\Test'
$verbName = 'print'
$verbArguments = ''
... вы можете распечатать все объекты в папке с...
$application = New-Object -ComObject 'Shell.Application'
$folder = $application.NameSpace($folderPath)
$folderItems = $folder.Items()
Write-Verbose "Folder ""$($folder.Self.Name)"" contains $($folderItems.Count) item(s)."
$folderItems.InvokeVerbEx($verbName, $verbArguments)
Я говорю "объекты", потому что $folderItems
будет содержать как файлы, так и папки. По умолчанию, по-видимому, перечислять подпапки и игнорировать скрытые объекты, в то время как глаголы игнорируются на объектах, которые их не поддерживают.
Если, например, вы хотите печатать только файлы с определенным расширением, которые являются непосредственными дочерними и включают скрытые файлы, вы можете сделать это, используя Filter()
метод...
New-Variable -Name 'SHCONTF_NONFOLDERS' -Option 'Constant' -Value 0x00040
New-Variable -Name 'SHCONTF_INCLUDEHIDDEN' -Option 'Constant' -Value 0x00080
$application = New-Object -ComObject 'Shell.Application'
$folder = $application.NameSpace($folderPath)
$folderItems = $folder.Items()
$folderItems.Filter($SHCONTF_NONFOLDERS -bor $SHCONTF_INCLUDEHIDDEN, '*.jpg')
Write-Verbose "Filtered folder ""$($folder.Self.Name)"" contains $($folderItems.Count) item(s)."
$folderItems.InvokeVerbEx($verbName, $verbArguments)
Если вы хотите напечатать какой-то нестандартный набор файлов, которые не выровнены по расширению, видимости и т. Д., То я не вижу способа сделать это. Это, казалось бы, требует изменения $folderItems
или создание нового FolderItems3
экземпляр, и ни один не представляется возможным. Я вижу, что есть ShellFolderView
тип, который поддерживает выбор элементов, но выглядит так, как будто он взаимодействует с окном Explorer-типа.
Документация для типов и констант, использованных выше:
Насколько я знаю, вы можете использовать foreach
перебрать все элементы в массиве элементов (файлы, которые вы хотите распечатать) и выполнить действие print
на каждом из них следующее:
Get-ChildItem "C:\" -Include "*.jpg" | ForEach-Object {start-process $_.FullName –Verb Print}
Start-Sleep -s 150
Это будет:
получить все файлы (jpg файлы), найденные в C
применить глагол
print
на каждом файле.
Примечание Вы можете использовать -wait
параметр для Start-Process
вместо Start-Sleep -s 150
; Это ожидает завершения указанного процесса и его потомков, прежде чем принимать дополнительные входные данные.