有没有办法使用Perl脚本来更改Windows文件夹图标?

有没有办法使用Perl脚本来更改Windows文件夹图标?

我的意图是将“xxx_documents”文件夹的普通图标更改为其他图标。 我必须以这样的方式来运行脚本,以便照顾整个驱动器。

该驱动器包含许多文件夹。 我必须search名为“文件”(例如“xxx_documents”或简单地“文件”)的每个文件夹,并从"%SystemRoot%\system32\SHELL32.dll"库中将其图标更改为一个。

在Perl中可能吗? 感谢所有帮助我的人。

你确定可以用Perl来做到这一点。 Windows通过使用每个文件夹中的隐藏系统Dekstop.ini文件来控制目录图标。 内容看起来像这样:

  [.ShellClassInfo] IconFile=%SystemRoot%\system32\SHELL32.dll IconIndex=41 

在Windows XP上(我假设在其他系统上),图标41是一棵树。 Windows需要将该文件明确设置为系统文件才能工作,这意味着我们需要深入研究Win32API::File以创建它:

  #!/usr/bin/perl use strict; use warnings; use Win32API::File qw(createFile WriteFile fileLastError CloseHandle); my $file = createFile( 'Desktop.ini', { Access => 'w', # Write access Attributes => 'hs', # Hidden system file Create => 'tc', # Truncate/create } ) or die "Can't create Desktop.ini - " . fileLastError(); WriteFile( $file, "[.ShellClassInfo]\r\n" . "IconFile=%SystemRoot%\\system32\\SHELL32.dll\r\n" . "IconIndex=41\r\n", 0, [], [] ) or die "Can't write Desktop.ini - " . fileLastError(); CloseHandle($file) or die "Can't close Desktop.ini - " . fileLastError(); 

如果您运行上面的代码,它应该将当前目录的图标设置为一棵树。 您可能需要在资源管理器提取更改之前刷新您的目录列表。

现在我们有了一种更改图标的方法,现在我们可以通过整个驱动器来更改每个与我们的模式相匹配的文件夹。 我们可以很容易地用File::Find或其中的一个替代方法(例如File::Find::RuleFile::Next )来做到这一点:

  #!/usr/bin/perl use strict; use warnings; use File::Find qw(find); use Win32API::File qw(createFile WriteFile fileLastError CloseHandle); my $topdir = $ARGV[0] or die "Usage: $0 path\n"; find( \&changeIcon, $topdir); sub changeIcon { return if not /documents$/i; # Skip non-documents folders return if not -d; # Skip non-directories. my $file = createFile( "$_\\Desktop.ini", { Access => 'w', # Write access Attributes => 'hs', # Hidden system file Create => 'tc', # Truncate/create } ) or die "Can't create Desktop.ini - " . fileLastError(); WriteFile( $file, "[.ShellClassInfo]\r\n" . "IconFile=%SystemRoot%\\system32\\SHELL32.dll\r\n" . "IconIndex=41\r\n", 0, [], [] ) or die "Can't write Desktop.ini - " . fileLastError(); CloseHandle($file) or die "Can't close Desktop.ini - " . fileLastError(); } 

不幸的是,我刚刚发现,如果目录中有或曾经有过一个图标,该图标只会被更改…显然,在目录本身设置了一个属性,导致Windows查找Desktop.ini文件,但我不能为了我的生活弄清楚它是什么。 因此,上述解决方案是不完整的; 我们还需要查找并修复添加图标的目录中的属性。

保罗

1。

 [.ShellClassInfo] LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21790 InfoTip=@%SystemRoot%\system32\shell32.dll,-12689 IconResource=%SystemRoot%\system32\imageres.dll,-108 IconFile=%SystemRoot%\system32\shell32.dll IconIndex=-237 

2。

 [.ShellClassInfo] LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21803 InfoTip=@%SystemRoot%\system32\shell32.dll,-12689 IconResource=%SystemRoot%\system32\imageres.dll,-3 

为了刷新图标,你将不得不调用一些SHChangeNotify voodoo(C ++的例子,但你明白了):

 int imageIndex = Shell_GetCachedImageIndexW(wPath, GetSyncFolderIconIndex(), 0); if (imageIndex != -1) { // If we don't do this, and we EVER change our icon, Explorer will likely keep // using the old one that it's already got in the system cache. SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD | SHCNF_FLUSHNOWAIT, &imageIndex, NULL); } SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW | SHCNF_FLUSHNOWAIT, wPath, NULL);