PowerShell 重命名或删除 Thumbs.db 个文件

PowerShell Rename or Delete Thumbs.db Files

我正在处理无法删除 Thumbs.db 的 Windows 错误,因为 Windows 认为它们是 "open"。

首先,我知道可以使用注册表编辑器删除这些文件,但我不拥有网络文件夹,因此无法访问服务器来执行此操作。但是,如果它对这里的任何人有帮助,你会怎么做:

 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 打印,但是当我尝试重命名时,我得到 "Cannot rename because file does not exist"。

[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";
} 

有什么想法吗?

TessellatingHeckler 在对问题的评论中提供了关键指针:

也许令人惊讶的是,Get-ChildItem 返回的 [System.IO.FileInfo] 实例绑定到 Rename-Item-Path 参数作为 strings 当作为 直接参数传递时 ,并且在字符串上下文中,a [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[]],您可以使用 @(),数组子表达式运算符 ,以确保命令的输出被视为数组,即使它 returns 只有一个项目(或 none):

$directory = @(Get-ChildItem ...)

也就是说,在 PSv3+ 上这通常是不必要的,因为 any scalar 值也可以用作如果它是一个数组;例如:

> $scalar = 'a single value'

# Treat $scalar as a collection:

# A scalar as a collection by definition has count 1.
> $scalar.Count
1  

# Enumerate the scalar in a foreach loop.
> foreach ($itm in $scalar) { "[$itm]" }
[a single value]

# Process the scalar in a pipeline using the ForEach-Object cmdlet.
> $scalar | ForEach-Object { "[$_]" }
[a single value]