powershell - 拖放到 Powershell 脚本

标签 powershell

我以为我已经找到了这个问题的答案,但我玩得越多,我就越认为它是 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 取得了出色的成绩 suggestion使用以下快捷方式命令行,但它没有正确传递参数。带有空格的路径在到达 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}

这两个放置处理程序的工作原理都是简单地调用文件类型的默认动词(双击文件时会发生什么)(视为 Shell 键的 (Default) 值) 。对于 PS1 文件,这是打开。默认情况下,此动词在记事本中显示 PowerShell 脚本——不是很有帮助。

通过修改 PS1 文件的“打开”动词来更改此行为:

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

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

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

以下是 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\" %*"

注释:

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

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

  • 请记住,您需要更改 Execution Policy (Set-ExecutionPolicy) 除非您使用签名脚本。

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

关于powershell - 拖放到 Powershell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819908/

相关文章:

Powershell 在 PSSession 中使用 Start-Process 打开记事本

windows - 从通过 SCCM 部署的 Powershell 脚本中运行 SFC.EXE

powershell - 如何 “get”异常上下文进行错误处理?

Powershell:从 $file.Fullname 中减去 $pwd

powershell - 识别Powershell中执行批处理文件的PID

c# - 如何只知道 ConsoleKey 枚举和修饰符来获取按键的字符?

iis - 为什么/如何在获取和设置时 ManagedPipelineMode 是不同的类型?

windows - 将参数从 Powershell 传递到批处理脚本

c# - 如何在 C# 中解密通过 PowerShell 加密的字符串

等效于 log4perl 的 Powershell