我想在文件夹中创建desktop.ini文件,这些文件引用子文件夹中的.jpg以便为父文件夹提供自定义图像。这可以手动完成此过程(右键单击文件夹>属性>自定义>选择文件)。
假设文件夹结构如下:
C:\Test
---> Folder1
---> Fullsize
---> image.jpg
---> Folder2
---> Fullsize
---> image.jpg
在手动处理之前,父文件夹(' Folder1')具有以下属性:'Directory'
。
手动处理后,该文件夹的属性为'ReadOnly, Directory'
。 ' Fullsize'子文件夹保留'Directory'
的原始属性。
使用如下内容创建desktop.ini文件:
[ViewState]
Mode=
Vid=
FolderType=Generic
Logo=C:\Test\Folder1\Fullsize\image.jpg
此外,编码为UTF-8,文件属性设置为HSA('Hidden, System, Archive'
)。
点击“确定”后,文件夹会立即显示图像预览。
将此转换为另一个文件夹的等效代码,我们有:
$folder2 = 'C:\Test\Folder2'
$folder2Image = "$folder2\Fullsize\image.jpg"
$ini = @"
[ViewState]
Mode=
Vid=
FolderType=Generic
Logo=$Folder2Image
"@
Set-ItemProperty $Folder2 -Name Attributes -Value 'ReadOnly'
# Out-File creates UTF-8 with BOM so use [System.IO.File]
[System.IO.File]::WriteAllLines("$Folder2\desktop.ini", $ini)
$inifile = Get-Item "$Folder2\desktop.ini"
$inifile.Attributes = 'Archive, System, Hidden'
尽管如此,folder2也不会显示图片预览。
检查Folder1和Folder2(Get-Item $ path | Select Attributes)的属性,以及desktop.ini文件,它们显示它们是相同的。
除了图像路径之外,desktop.ini的编码和实际内容是相同的。图像的路径是正确的。文件在每行末尾包含CRLF。我甚至确保图像的路径是正确的(不是它应该重要)。
彻底难倒。手动过程还有什么可以做的,我错过了?
Windows 10:版本1607(OS Build 14986.1001)
答案 0 :(得分:1)
必须使用Shell API方法更新Desktop.ini才能通知Shell / Explorer:
function Set-FolderImage($folder, $imagePath) {
# make a temporary folder with desktop.ini
$tmpDir = (Join-Path $env:TEMP ([IO.Path]::GetRandomFileName()))
mkdir $tmpDir -force >$null
$tmp = "$tmpDir\desktop.ini"
@"
[ViewState]
FolderType=Generic
Logo=$imagePath
"@ >$tmp
(Get-Item -LiteralPath $tmp).Attributes = 'Archive, System, Hidden'
# use a Shell method to move that file into the destination
$shell = New-Object -com Shell.Application
$shell.NameSpace($folder).MoveHere($tmp, 0x0004 + 0x0010 + 0x0400)
# FOF_SILENT 0x0004 don't display progress UI
# FOF_NOCONFIRMATION 0x0010 don't display confirmation UI, assume "yes"
# FOF_NOERRORUI 0x0400 don't put up error UI
del -LiteralPath $tmpDir -force
}
用法:
Set-FolderImage 'R:\Temp' 'R:\33983.jpg'