【问题标题】:How to invoke a verb on multiple files如何在多个文件上调用动词
【发布时间】:2019-06-29 02:24:50
【问题描述】:

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

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

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

【问题讨论】:

  • 您熟悉ForEach-Objectfor/foreach 循环吗?
  • 我很熟悉,但这将为每张照片打开一个新的打印窗口。在资源管理器中,您可以对选定的文件执行此操作

标签: windows powershell printing windows-shell shell-verbs


【解决方案1】:

您可以使用 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 实例,而且似乎都不可能。我看到有一个支持item selectionShellFolderView type,但它看起来像是用于与资源管理器(类似)窗口进行交互。

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

【讨论】:

  • 非常感谢。这几乎是答案。只有一个小问题。我在一个文件夹中有文件列表,如 $fileList = "C:\Projects\Javascript\photos\Silvercoins.jpg","C:\Projects\Javascript\photos\celeste.png";。我尝试对文件夹项应用过滤器,但它随后一次显示打印预览。如果没有过滤器,它会分批打印。你也可以帮忙吗?
  • 您对Filter() 的调用是什么样的?您希望Silvercoins.jpgceleste.png 在相同或不同的打印作业中打印?这些是photos\` 中唯一支持打印的文件,还是您希望排除打印的其他文件?
  • 我的过滤器是 $folderItems = $folder.Items() | ? { $fileList - 包含 $_.Path };这些不是唯一支持打印的文件,我在我的程序中选择一些文件然后打印它们。谢谢
  • 要更改InvokeVerbEx() 操作的文件,您需要以某种方式修改$folder.Items() 返回的集合; $folder.Items() | ? { $fileList -contains $_.Path } 完全生成一个新集合。如果您需要对任意一组文件进行操作,我能想到的潜在解决方法是 1)将该组文件复制到临时目录并从那里打印,2)与 #1 相同,但使用快捷方式/符号链接/硬链接到原始文件,或者 3) 如果您只打印图形文件,也许有一个模块或库可以轻松地从这些文件创建打印作业。
【解决方案2】:

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

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

这将:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多