【问题标题】:Creating desktop.ini with PowerShell for custom folder icon not working on Windows 10使用 PowerShell 为自定义文件夹图标创建 desktop.ini 在 Windows 10 上不起作用
【发布时间】:2017-02-17 14:41:37
【问题描述】:

我想在文件夹中创建 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(操作系统内部版本 14986.1001)

【问题讨论】:

  • 注意:如果您将此代码复制并粘贴到 PowerShell shell 中,它将创建一个带有 LF 而不是 CRLF 的 desktop.ini。

标签: windows powershell


【解决方案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'

【讨论】:

  • 谢谢。我尝试将您的额外步骤拼接到我现有的函数中,然后求助于运行您的函数本身,但这对我不起作用。我什至使用了您使用的文件夹结构(也就是说,一个空文件夹并指定一个位于其外部的图像(而不是我的结构))。在另一台 W10 机器(1607 14393.693)上尝试过,仍然没有运气!我很好奇这是否可以在 W7 下工作,但目前没有可以测试的机器。
  • 此代码适用于 Windows 10 和 7。请让我看看您的改编版本。
  • 确保您已在 Explorer 中切换到图标视图模式,IIRC 它不会在小/详细视图中显示自定义图像。
  • 更新Win10后问题重现。目前没有想法,也许以后。
  • 到目前为止,我可以说这个答案中的方法绝对适用于自定义文件夹图标(不是图像)。
【解决方案2】:

真正的诀窍是对文件夹执行此操作

(Get-Item $Folder -Force).Attributes = 'ReadOnly, Directory'

处理隐藏文件时的另一个很酷的提示: 在任何资源管理器窗口中,通过连续按下这些键来切换隐藏文件: AltAHH

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多