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]
我正在处理无法删除 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]