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

标签 windows perl shell

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

我的意图是将“xxx_documents”文件夹的普通图标更改为其他图标。我必须以处理整个驱动器的方式运行脚本。

驱动器包含许多文件夹。我必须搜索每个名为“documents”的文件夹(例如“xxx_documents”或简称“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 文件,但我终究无法弄清楚它是什么。因此,上述解决方案是不完整的;我们还需要在我们添加图标的目录中找到并修复属性。

保罗

关于windows - 有没有办法使用 Perl 脚本更改 Windows 文件夹图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036832/

相关文章:

shell - 在 csh Shell 脚本中读取带空格的用户输入

linux - 执行 SSH 后如何在 Perl 脚本中调用函数?

database - 在 Perl 中创建公共(public)访问 API

windows - 如何更改 MASM32 中的链接器设置

python - 如何在 Python 3.6 中将 .eps 文件转换为 .png

mysql - 在perl中转义单引号

linux - 在 ksh 中拆分字符串

linux - 当命令询问时不期望通过 bourne shell 脚本输入密码

javascript - Active Directory - 在 Web 应用程序中使用当前登录的用户,可能吗?

Windows 托管错误上的 php 联系表单