假设我们在 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
然后,在你的桌面上:
- 右键单击,
New >
->Shortcut
- 类型
PowerShell -File '<path to .ps1 file>'
- 单击
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 文件。只能通过代码来设置或清除该属性,而不是通过“属性”对话框中那个误导性的复选框。只能通过代码或
Attributes
EXplorer 详细信息视图中的列来访问其状态,而不是通过“属性”对话框中那个误导性的复选框。
设置该属性后,文件夹会显示目标文件夹的内容,就像是它自己的一样——一个命名空间连接点。请注意,快捷方式本身可以删除,而不会影响目标的内容,但内容快捷方式是目标的内容——由于它们是同一个项目,因此在任一位置创建、编辑和删除的项目都会在另一个位置看到。
参考文献: