Как вызвать глагол для нескольких файлов - PullRequest
2 голосов
/ 29 июня 2019

Используя PowerShell, я хотел бы вызвать глагол печати для нескольких файлов. В проводнике Windows я могу зайти в папку, выбрать несколько файлов, щелкнуть правой кнопкой мыши и выбрать параметры печати. Откроется диалоговое окно «Печать изображений» со всеми выбранными файлами. Я могу сделать это для одного файла, используя:

$path = "C:\person.jpg";
Start-Process -FilePath $path -Verb Print | Out-Null;
Start-Sleep -s 150;

Но мне было интересно, как я могу сделать это для ряда файлов.

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вы можете использовать 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 тип , который поддерживает выбор элемента , но похоже, что он предназначен для взаимодействия с окном, похожим на Проводник.

Документация для типов и констант, использованных выше:

1 голос
/ 29 июня 2019

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

...