我意识到这个问题已经有几年了,但由于它仍然是许多与通过资源管理器拖放运行 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
这将覆盖默认处理。