我想通过VBA和PowerShell命令清除Windows 操作系统剪贴板历史记录。
我是Windows 10用户。
这是清除Windows 操作系统剪贴板历史记录的 PowerShell 命令行。
PS C:\Windows\system32> Restart-Service -Name "cbdhsvc*" -force
以下链接可能有助于理解我在说什么。
我想通过VBA和PowerShell命令清除Windows 操作系统剪贴板历史记录。
我是Windows 10用户。
这是清除Windows 操作系统剪贴板历史记录的 PowerShell 命令行。
PS C:\Windows\system32> Restart-Service -Name "cbdhsvc*" -force
以下链接可能有助于理解我在说什么。
先决条件:
使用 PowerShell有两种方法清除剪贴板历史记录
使用类
::ClearHistory()
的静态方法。Windows.ApplicationModel.DataTransfer.Clipboard
这样做的优点是不需要提升(以管理员身份运行)。
但是,由于它是UWP类,因此它仅适用于Windows PowerShell,因为至少从当前版本 7.4.x 底层的 .NET 8 版本开始, PowerShell (Core) 7+无法访问此类类。
此外,这仅适用于前台运行空间(UI 线程),因此不能用于后台作业(例如,包括基于线程的作业)。
使用
Restart-Service
cmdlet停止并重新启动剪贴板历史记录 Windows 服务:不幸的是,此方法仅适用于提升的PowerShell 会话。
但是,它也适用于 PowerShell 7+,并且还可以用于(提升的)非前台调用,例如来自作业的调用。
该
Set-Clipboard $null
调用确保当前剪贴板数据也被删除(上面的 .NET API 调用会自动执行此操作),但请注意,在 PowerShell 7+ 中(与Windows PowerShell不同),这不会清除当前剪贴板,而是替换其内容带有一个空字符串,在历史记录中如此记录;但是,由于重新启动服务并因此在此调用后清除历史记录,这并不重要。如果您在较旧的系统上运行(Windows 10 之前的系统,或者可能是非常早期、早已过时的 Windows 10 版本),则通配符表达式将与现有服务名称不匹配,并且该操作将是安静的 no-op。
要排除这种情况,您可以运行以下命令:
需要通配符模式,因为剪贴板历史服务的全名在每次登录时都会发生变化,这是由于
_
后跟 5 个十六进制数字组成的(伪)随机后缀,例如cbdhsvc_5e5a8
。从 VBA调用剪贴板历史清除 PowerShell 命令:
使用COM对象
.Run()
的方法WScript.Shell
...... 调用
powershell.exe
Windows PowerShell CLI,其调用::ClearHistory()
显示在顶部。下面的代码运行 PowerShell 控制台窗口,该窗口总是通过在调用中使用窗口样式创建为 hide。 要进行故障排除,请切换到,并将其置于通话中。
vbHide
.Run()
vbNormalFocus
-NoExit
-Command
powershell.exe
如果由于某种原因,
powershell.exe
无法从 VBA 托管应用程序的 UI 线程进行调用,则需要使用该Restart-Service
方法,并且这样做总是需要提升。然后,您必须
powershell.exe
以嵌套方式调用,以便内部powershell.exe
调用可以通过请求提升。Start-Process
-Verb RunAs
重要信息:除非托管 VBA 的应用程序本身正在运行提升,否则您将看到一个UAC对话框来确认或授权提升请求。
与直接使用 PowerShell 一样,这意味着非管理员用户无法运行该命令,除非管理员在场提供其凭据以授权该请求。
通过考虑安全性的设计,您无法自动响应 UAC 对话框,并且从非提升进程中避免它们的唯一方法是完全禁用 UAC(部分),出于安全原因,强烈建议不要这样做,或者 - 但前提是原则上您是管理员组的成员 - 定义执行所需操作的计划任务。有关详细信息,请参阅此答案。
下面的代码通过在调用中使用而不是在嵌套 PowerShell调用中使用来运行隐藏创建的 PowerShell 控制台窗口。 要进行故障排除,请切换到两个通话并在其中使用。
vbHide
vbNormalFocus
.Run()
-WindowStyle Hidden
Start-Process
vbNormalFocus
-NoExit
powershell.exe