PowerShell,将回收站添加到快速访问

PowerShell,将回收站添加到快速访问

我非常希望使用 PowerShell 将“回收站”添加到文件资源管理器的“快速访问”区域(因为这是我希望在所有新系统上都拥有的标准功能)。添加到“快速访问”很简单:

$oShell = New-Object -ComObject Shell.Application
$oShell.Namespace("C:\ProgramData\chocolatey\lib").Self.InvokeVerb("PinToHome")

问题是“回收站”当然不是一个普通的文件夹。但是,可以按如下方式访问它:

$oShell = New-Object -ComObject Shell.Application
$rb = $oShell.Namespace(10)

但是添加“快速访问”$rb.Self.InvokeVerb("PinToHome")不起作用。

有人能告诉我如何以编程方式将“回收站”添加到“快速访问”中吗?我知道这是可以做到的,因为将项目从桌面拖到文件资源管理器上就可以了,所以一定也有一些可编程的方法来实现这一点?

答案1

来源:使用 InvokeVerb 将回收站固定到快速访问

尝试这个:

$RBPath = 'HKCU:\Software\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\pintohome\command\'
$name = "DelegateExecute"
$value = "{b455f46e-e4af-4035-b0a4-cf18d2f6f28e}"
New-Item -Path $RBPath -Force | out-null
New-ItemProperty -Path $RBPath -Name $name -Value $value -PropertyType String -Force | out-null
$oShell = New-Object -ComObject Shell.Application
$trash = $oShell.Namespace("shell:::{645FF040-5081-101B-9F08-00AA002F954E}")
$trash.Self.InvokeVerb("PinToHome")
Remove-Item -Path "HKCU:\Software\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}" -Recurse

答案2

这实际上不是 PS 代码问题,也不是程序问题。这是特定于操作系统的限制/障碍。

Windows 资源管理器是一个程序,因此具有它直接提供的功能,这些功能在其外部可能可用也可能不可用。

如果微软不提供句柄来执行此操作,那么就需要大量与 Windows 资源管理器相关的黑客攻击才能发现它。

我个人认为这种固定功能没有任何用处,因为它已经可以在你的桌面、“开始”菜单中使用了,而且你可以固定到任务栏以便快速访问,但是我们都有自己使用 X 或 Y 东西/方法的理由。

当您深入了解 Windows 资源管理器功能时。例如,如此处所述:Shell.探索,方法;由此您可以确定,在 Windows 资源管理器中,只需在路径输入中执行类似操作即可获取文件夹时间。外壳:发送到。

然而,如果你尝试过回收利用,shell:桌面\回收站Bin 则将失败,原因已说明。因此,您需要进一步研究此类文档以了解其他可能性。RB 只是一个应用程序调用的 .lnk。

正如您在帖子中指出的那样:

$oShell = New-Object -ComObject Shell.Application
$rb = $oShell.Namespace(10)

如果你进一步深入...

$oShell = New-Object -ComObject Shell.Application
(($rb = $oShell.Namespace(10))).ParentFolder
# Results
<#
Title                      : Desktop
Application                : System.__ComObject
Parent                     : 
ParentFolder               : 
Self                       : System.__ComObject
OfflineStatus              : 
HaveToShowWebViewBarricade : False
ShowWebViewBarricade       : False
#>

您可以从用例中看到此问题。

对于所有 Windows 资源管理器特殊文件夹,都有这些:

[Enum]::GetNames('System.Environment+SpecialFolder')
# Results
<#
Desktop
Programs
MyDocuments
Personal
Favorites
Startup
Recent
SendTo
StartMenu
MyMusic
MyVideos
DesktopDirectory
MyComputer
NetworkShortcuts
Fonts
Templates
CommonStartMenu
CommonPrograms
CommonStartup
CommonDesktopDirectory
ApplicationData
PrinterShortcuts
LocalApplicationData
InternetCache
Cookies
History
CommonApplicationData
Windows
System
ProgramFiles
MyPictures
UserProfile
SystemX86
ProgramFilesX86
CommonProgramFiles
CommonProgramFilesX86
CommonTemplates
CommonDocuments
CommonAdminTools
AdminTools
CommonMusic
CommonPictures
CommonVideos
Resources
LocalizedResources
CommonOemLinks
CDBurning
#>

...请注意,快速访问等功能不属于其中之一。因此,壳:,对于它以及该列表中的其他几个来说都不是一个选项。

更新

因此,根据我的评论...... 你可以操纵你所创造的任何东西。 ...到您的 GUID 使用注释。然后您可以这样做:

New-Item -Path 'C:\' -Name Temp -ItemType Directory -Force
New-Item -Path 'C:\temp' -Name 'Recycle Bin.{645FF040-5081-101B-9F08-00AA002F954E}' -ItemType Directory
($TargetShellObject = (Get-ChildItem -Path 'C:\Temp' -Filter 'Recycle*').FullName)
$oShell = New-Object -ComObject Shell.Application
$oShell.Namespace("$TargetShellObject").Self.InvokeVerb("PinToHome")

这会将该新目录放入快速访问列表中,仅显示名称而不显示 GUID,直到您查看其属性。但是,猜猜如果您尝试清理/删除该手动创建的文件夹会发生什么?关闭并重新启动 Windows 资源管理器后,它就消失了,QA 中的图钉也消失了。

因此,这意味着一旦创建该文件夹对象,就永远无法删除它。因此,为了防止其他人删除它,您必须隐藏或保护它。因此,像这样的东西......

New-Item -Path 'C:\' -Name 'QuickAccessObjects' -ItemType Directory -Force
New-Item -Path 'C:\QuickAccessObjects' -Name 'Recycle Bin.{645FF040-5081-101B-9F08-00AA002F954E}' -ItemType Directory

(Get-Item -Path 'C:\QuickAccessObjects').attributes = 'Hidden'

($TargetShellObject = (Get-ChildItem -Path 'C:\QuickAccessObjects' -Filter 'Recycle*').FullName)

$oShell = New-Object -ComObject Shell.Application
$oShell.Namespace("$TargetShellObject").Self.InvokeVerb("PinToHome")

在此处输入图片描述

更新

根据评论。使用 $env:windir,我得到相同的结果。无论视图设置如何,都没有 GUID,保存 Tiles 仍然只显示路径。

在此处输入图片描述 正如演示所示,这一切都是在 Windows Sandbox 原始环境中完成的。

相关内容