如何在多个文件上调用动词
How to invoke a verb on multiple files
我想使用 PowerShell 在多个文件上调用打印动词。在 Windows 资源管理器中,我可以进入一个文件夹,select 一些文件,右键单击并选择打印选项。这将打开包含所有 selected 文件的“打印图片”对话框。我可以使用以下方法对一个文件执行此操作:
$path = "C:\person.jpg";
Start-Process -FilePath $path -Verb Print | Out-Null;
Start-Sleep -s 150;
但我想知道如何为多个文件执行此操作。
据我所知,您可以使用 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
;这会等待指定的进程及其后代在接受更多输入之前完成。
您可以使用 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)
我说 "objects" 因为 $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
type that supports item selection,但它看起来像是用于与 Explorer(类似)window.
交互
上面使用的类型和常量的文档:
我想使用 PowerShell 在多个文件上调用打印动词。在 Windows 资源管理器中,我可以进入一个文件夹,select 一些文件,右键单击并选择打印选项。这将打开包含所有 selected 文件的“打印图片”对话框。我可以使用以下方法对一个文件执行此操作:
$path = "C:\person.jpg";
Start-Process -FilePath $path -Verb Print | Out-Null;
Start-Sleep -s 150;
但我想知道如何为多个文件执行此操作。
据我所知,您可以使用 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
;这会等待指定的进程及其后代在接受更多输入之前完成。
您可以使用 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)
我说 "objects" 因为 $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
type that supports item selection,但它看起来像是用于与 Explorer(类似)window.
上面使用的类型和常量的文档: