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

Use*_*611 6 windows shell perl

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

我的目的是将"xxx_documents"文件夹的普通图标更改为其他图标.我必须以这样一种方式运行脚本,它会照顾整个驱动器.

该驱动器包含许多文件夹.我必须搜索名为"documents"的每个文件夹(例如"xxx_documents"或简称"文档"),并将其图标更改为"%SystemRoot%\system32\SHELL32.dll"库中的图标.

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

pjf*_*pjf 8

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

 [.ShellClassInfo]
 IconFile=%SystemRoot%\system32\SHELL32.dll
 IconIndex=41
Run Code Online (Sandbox Code Playgroud)

在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();
Run Code Online (Sandbox Code Playgroud)

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

现在我们有了改变图标的​​方法,现在我们可以遍历整个驱动器并更改与我们的模式匹配的每个文件夹.我们可以很容易地使用File::Find它或其中一个替代品(例如File::Find::Rule,或File::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();
 }
Run Code Online (Sandbox Code Playgroud)

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

保罗

  • 根据http://msdn.microsoft.com/en-us/library/cc144102.aspx,您还需要在包含文件夹上设置系统属性. (3认同)