有没有办法制作一个“智能”桌面对象,根据特定目标文件夹的子文件夹是否包含某个子文件夹来过滤它?

有没有办法制作一个“智能”桌面对象,根据特定目标文件夹的子文件夹是否包含某个子文件夹来过滤它?

假设我们在 Windows 10 中有以下文件夹层次结构:

  data
    acme widgets
       2022
       2023
       2024
    gizmos
        2023
    etc1
    etc2
    ...
    etc999

层次结构中的“acme widgets”和“gizmos”级别有数百个兄弟文件夹,其中一些文件夹将包含 2024 文件夹,例如acme 小部件有些则不会,比如小玩意. 但那些没有2024文件夹最终会将其添加到其子文件夹中,并且最终会将一个或多个文件添加到2024文件夹。此时我需要采取一些行动。

因此,我希望能够单击桌面图标,该图标仅显示文件夹下的文件夹列表(理想情况下是可导航的文件夹)数据包含2024子文件夹中有一个或多个文件。无法预测这些文件的名称。可以使用 Power Shell 创建这样的智能桌面图标吗?如果可以,我需要掌握哪些功能(即命令名称)?

值得一提的是,我正在处理存储在这种层次结构中的文件夹和文件,该层次结构由其他人维护,他们没有告诉我何时在其中一个子文件夹中创建了 2024 文件夹或何时向其中添加了文件。

我不想在文件夹层次结构中添加任何类型的“监听器”;只需某种过滤机制就足够了。

答案1

电源外壳,定义搜索相对简单。为了将结果整合到可浏览的集合中,我喜欢使用文件夹快捷方式,这是一种仅限 shell 的目录连接,其行为类似于真正的文件夹。

编辑:解释遵循下面的代码和说明 EDIT2:代码“收紧”,并指定-LiteralPath 其可用位置

将代码复制到记事本并保存为.ps1文件:

$DataPath     = 'C:\Path\to\Data'
$filteredPath = "$env:Temp\FiiteredData"
# Start fresh each run
If (Test-Path -LiteralPath $filteredPath) {
    Remove-Item -LiteralPath $filteredPath -Recurse -Force
}
mkdir $FilteredPath | out-null

Get-ChildItem -LiteralPath $DataPath -Directory -Recurse -Depth 1 |
  where name -eq '2024' | where {Get-ChildItem -LiteralPath $_.FullName -File} | ForEach-Object {
    # Setting the ReadOnly attribute for a folder enables desktop.ini processing 
    ($newFolder                = mkdir (Join-Path $FilteredPath $_.Parent.Name)).Attributes += 'ReadOnly'
    $TargetShortcut            = (New-Object -com wscript.shell).CreateShortcut("$NewFolder\Target.lnk")
    $TargetShortcut.TargetPath = $_.Parent.FullName
    $TargetShortcut.Save()
    # Tells the shell to link to the contents of Target.lnk
    "[.ShellClassInfo]`nCLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}`nFlags=2`n`n" | Set-Content "$newFolder\desktop.ini"
}
# Open EXplorer to our folder populated with folder shortcuts
Invoke-Item -LiteralPath $FilteredPath

然后,在你的桌面上:

  1. 右键单击,New >->Shortcut
  2. 类型PowerShell -File '<path to .ps1 file>'
  3. 单击Next,随意命名,然后Finish

笔记:如果你从未跑步PowerShell 1你的机器上的脚本,你可能需要修改执行策略。为此,打开 Windows PowerShell 控制台并输入:

  • Set-ExecutionPolicy RemoteSigned

一切就绪。


逻辑:

  • 获取顶级文件夹(公司名称)及其子文件夹(年份)的 Directeryinfo 对象
    • Get-ChildItem -LiteralPath $DataPath -Directory -Recurse -Depth 1
  • 过滤Name以仅选择名为“2024”的文件夹(公司文件夹可以作为此文件夹的属性进行访问)
    • where name -eq '2024'
  • 然后根据它们是否包含任何文件进行过滤([Bool](Get-ChildItem -File)如果文件夹不包含任何文件则为 false)
  • where {Get-ChildItem -LiteralPath $_.FullName -File}
  • 当文件夹满足过滤条件时,创建一个文件夹快捷方式到其父文件夹(公司名称)

...文件夹快捷方式到底是什么?

Windows Shell 的最佳技巧之一。在文件系统级别,它由一个文件夹组成,该文件夹的名称将是快捷方式的显示名称。该文件夹包含两个文件,一个“Target.lnk”文件,它是目标文件夹的“普通”快捷方式,以及一个带有神奇咒语的“desktop.ini”:

[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2
  • 除非设置了文件夹的 ReadOnly 属性,否则 shell 不会处理文件夹的 Desktop.ini 文件。只能通过代码来设置或清除该属性,而不是通过“属性”对话框中那个误导性的复选框。只能通过代码或AttributesEXplorer 详细信息视图中的列来访问其状态,而不是通过“属性”对话框中那个误导性的复选框。

设置该属性后,文件夹会显示目标文件夹的内容,就像是它自己的一样——一个命名空间连接点。请注意,快捷方式本身可以删除,而不会影响目标的内容,但内容快捷方式是目标的内容——由于它们是同一个项目,因此在任一位置创建、编辑和删除的项目都会在另一个位置看到。

参考文献:

相关内容