我正在处理你无法删除Thumbs.db的Windows错误,因为Windows认为它们是"打开"。
首先,我知道使用regedit允许删除这些内容的可能性,但我不拥有网络文件夹,因此无法访问服务器来执行此操作。但是,如果有人帮助你,你会怎么做:
add a new "Explorer" Registry path:
HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer\
and then add a DWORD entry called "DisableThumbsDBOnNetworkFolders", and set it to 1.
我发现如果我手动重命名Thumbs.db来说" ThisSucks.db"然后我可以删除该文件。我有很多这些带有Thumbs的文件夹,所以我想编写一个PS脚本来重命名所有这些文件或者删除奖金。
当我将拇指收集到一个集合中时,我看到每个文件的Write-Host打印,但是当我尝试重命名时,我得到了#34;无法重命名,因为文件不存在"。
[System.Object[]] $directory = Get-ChildItem -Path $Path -Filter "*.db" -Force -Recurse;
foreach($file in $directory){
Write-Host -ForegroundColor Green "Found Thumb files";
Rename-Item $file "StupidFile.db";
}
有什么想法吗?
答案 0 :(得分:3)
TessellatingHeckler在对该问题的评论中提供了关键指针:
也许令人惊讶的是,[System.IO.FileInfo]
返回的 Get-ChildItem
个实例作为字符串绑定到Rename-Item
的{{1}}参数当作为直接参数 传递时,并且在字符串上下文中, -Path
实例扩展为其纯粹的文件名,而不是< em>完整路径 。
因此,除非[System.IO.FileInfo]
实例恰好引用当前目录中的文件,否则[System.IO.FileInfo]
无法找到它。
通过管道绑定Rename-Item
实例不受此陷阱([System.IO.FileInfo]
属性为用于绑定到.PSPath
),因此您可以使用以下内容:
-Path
请注意 Get-ChildItem -Path $Path -Filter '*.db' -Force -Recurse |
Rename-Item -NewName 'StupidFile.sb' -WhatIf
开关,预览重命名操作。删除此开关以执行实际重命名。
关于您的第一个陈述的说明,-WhatIf
:
您可以使用 [System.Object[]] $directory = Get-ChildItem ...
数组子表达式运算符,而不是转换为[System.Object[]]
,以确保将命令的输出视为数组,即使它只返回一个项目(或没有):
@()
也就是说,在 PSv3 + 上,这通常不是必需的,因为任何标量值也可以像使用数组一样 EM> 强>; e.g:
$directory = @(Get-ChildItem ...)