Как вызвать глагол для нескольких файлов

Используя 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; Это ожидает завершения указанного процесса и его потомков, прежде чем принимать дополнительные входные данные.

Другие вопросы по тегам