2

使用 PowerShell 我想在多个文件上调用 print 动词。在 Windows 资源管理器中,我可以进入一个文件夹,选择多个文件,右键单击并选择打印选项。这将打开包含所有选定文件的“打印图片”对话框。我可以使用以下方法对一个文件执行此操作:

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

但是想知道如何为许多文件做到这一点。

4

2 回答 2

3

您可以使用 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类型支持item selection,但它看起来像是用于与 Explorer(-like) 窗口进行交互。

上面使用的类型和常量的文档:

于 2019-06-29T18:39:39.867 回答
1

据我所知,您可以使用foreach来遍历项目数组(要打印的文件)中的所有项目,print并按如下方式对每个项目执行操作:

Get-ChildItem "C:\" -Include "*.jpg" | ForEach-Object {start-process $_.FullName –Verb Print}
Start-Sleep -s 150

这会:

  • 获取在 C 中找到的所有文件(jpg 文件)

  • print在每个文件上应用动词。

注意 您可以使用-wait参数 forStart-Process而不是Start-Sleep -s 150; 这将等待指定进程及其后代完成,然后再接受更多输入。

于 2019-06-29T06:07:00.347 回答