使用PowerShell创建desktop.ini,以便在Windows 10上无法使用自定义文件夹图标

时间:2017-02-17 14:41:38

标签: windows powershell

我想在文件夹中创建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也不会显示图片预览。

Folder view

检查Folder1和Folder2(Get-Item $ path | Select Attributes)的属性,以及desktop.ini文件,它们显示它们是相同的。

除了图像路径之外,desktop.ini的编码和实际内容是相同的。图像的路径是正确的。文件在每行末尾包含CRLF。我甚至确保图像的路径是正确的(不是它应该重要)。

彻底难倒。手动过程还有什么可以做的,我错过了?

desktop.ini files in Notepad++

Windows 10:版本1607(OS Build 14986.1001)

1 个答案:

答案 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'