拖放到 Powershell 脚本

2024-05-29

我以为我已经找到了这个问题的答案,但我玩得越多,我就越发现它是 Powershell 的设计缺陷。

我想拖放(或使用发送到机制)将多个文件和/或文件夹作为数组传递到 Powershell 脚本。

测试脚本

#Test.ps1
param ( [string[]] $Paths, [string] $ExampleParameter )
"Paths"
$Paths
"args"
$args

尝试#1

我使用以下命令行创建了一个快捷方式,并将一些文件拖到上面。这些文件作为单独的参数出现,首先在位置上与脚本参数匹配,其余部分放置在 $args 数组中。

尝试 #1 的捷径

powershell.exe -noprofile -noexit -file c:\Test.ps1

包装脚本

我发现我可以用包装脚本来做到这一点......

#TestWrapper.ps1
& .\Test.ps1 -Paths $args

包装脚本的快捷方式

powershell.exe -noprofile -noexit -file c:\TestWrapper.ps1

批处理文件包装脚本

它通过批处理文件包装脚本工作......

REM TestWrapper.bat
SET args='%1'
:More
SHIFT
IF '%1' == '' GOTO Done
SET args=%args%,'%1'
GOTO More
:Done
Powershell.exe -noprofile -noexit -command "& {c:\test.ps1 %args%}"

尝试的答案

基思·希尔 (Keith Hill) 表现出色建议 https://stackoverflow.com/questions/2819908/drag-and-drop-to-a-powershell-script/2820207#2820207使用以下快捷方式命令行,但它没有正确传递参数。带有空格的路径在到达 Test.ps1 脚本时被分开。

powershell.exe -noprofile -noexit -command "& {c:\test1.ps1 $args}"

有没有人找到一种无需额外脚本即可做到这一点的方法?


我意识到这个问题已经有几年了,但由于它仍然是许多与通过资源管理器拖放运行 PowerShell 相关的 Google 查询的首要结果,我想我应该将我今天想到的内容发布在希望它能帮助别人。

我希望能够将文件拖放到 PowerShell (ps1) 脚本上,但找不到任何好的解决方案(没有任何不涉及额外脚本或快捷方式的解决方案)。我开始研究注册表中的文件关联,并想出了一些似乎运行良好的东西。

首先,我们需要为 .PS1 文件添加 DropHandler 条目,以便 Explorer 知道 PS1 文件应该接受拖放操作。通过此注册表更改来做到这一点。您可能必须创建 ShellEx 和 DropHandler 子项。

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler\
(Default) = {60254CA5-953B-11CF-8C96-00AA00B8708C}

此放置处理程序是 Windows 脚本宿主使用的处理程序。这是我的第一选择,因为它支持长文件名。如果您遇到空格或其他问题,您可以尝试标准 Shell32 可执行文件(.exe、.bat 等)删除处理程序:{86C86720-42A0-1069-A2E8-08002B30309D}.

这两个放置处理程序都通过简单地调用文件类型(视为(Default)Shell 键的值)。对于 PS1 文件,这是Open。默认情况下,这个动词在记事本中显示 PowerShell 脚本——不是很有帮助。

通过修改 PS1 文件的 Open 动词来更改此行为:

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command\
(Default) = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -File "%1" %*

这将在打开时在 PowerShell 中运行脚本,并向其传递所有参数(删除的文件)。我将其设置为在脚本完成后保持打开状态,但是您可以通过删除-NoExit option.

就是这样。我还没有进行任何广泛的测试,但到目前为止它似乎运行得很好。我可以删除单个文件/文件夹以及组。参数列表中文件的顺序并不总是您所期望的(资源管理器对选定文件进行排序的一个怪癖),但除此之外,它似乎很理想。您还可以在以下位置创建 PS1 文件的快捷方式Shell:Sendto,允许您使用“发送到”菜单传递文件。

以下是 REG 文件格式的两项更改:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit -File \"%1\" %*"

Notes:

  • 由于这些更改,在资源管理器中双击 PS1 文件将执行该脚本;要编辑而不是打开,您必须使用右键单击菜单。正如一个建议(从痛苦的经历中遗憾地学到的:),如果您有采取破坏性操作的脚本,您可能会考虑使用确认/健全性检查守卫。

  • 通过拖放操作运行的脚本将有一个默认的起始工作目录C:\Windows\system32\。另一个需要小心的原因。

  • 请记住,您需要更改您的执行政策 http://msdn.microsoft.com/en-us/library/windows/desktop/bb648601%28v=vs.85%29.aspx(Set-ExecutionPolicy) 除非您使用签名脚本。

  • 如果您在 Windows 10 上调整了 .PS1 文件的处理,则需要删除注册表项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice这将覆盖默认处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拖放到 Powershell 脚本 的相关文章

随机推荐