【问题标题】:Batch file to attach icons to subfolders将图标附加到子文件夹的批处理文件
【发布时间】:2017-01-15 12:03:33
【问题描述】:

描述

00) 我有一个带有子文件夹的文件夹。

01) 每个父母和孩子都有一个.ico 文件。

02) 所有.ico 文件的名称完全相同。

我想做什么

我正在尝试创建一个批处理文件,将每个 .ico 附加到其文件夹

我的步骤

一开始听起来很简单,我创建了一个包含以下内容的 desktop.ini 文件:

[.ShellClassInfo] 
ConfirmFileOp=0 
NoSharing=1 
IconFile=Icon.ico 
IconIndex=0 
InfoTip= 

然后我创建了一个脚本来完成这项工作:

REM cd the current directory
CD "%cd%"
set startdir=%cd% 
set MYDIR=%cd%
REM it returns the last branch from the path (/../../last). This is the PARENT NAME FOLDER
set MYDIR1=%MYDIR:~0% 
for %%f in (%MYDIR1%) do set myfolder=%%~nxf
REM ECHO %myfolder% > ccc.txt
REM we need a for loop here, after taking all the folder name (not path) from subfolders
set child=CHILD4
ATTRIB +s "%child%"
CD "%child%"
set ICONCOPYDIR=%cd%\OriginalIcon.ico
REM two lines above are useless. If I remove them, the icon does not get attached
ECHO %ICONCOPYDIR% > cet.txt
ECHO %startdir% > cet.txt
COPY /Y %ICONCOPYDIR%  ".\Icon.ico"
ECHO [.ShellClassInfo] >> desktop.txt
ECHO ConfirmFileOp=0 >> desktop.txt
ECHO NoSharing=1 >> desktop.txt
ECHO IconFile=Icon.ico >> desktop.txt
ECHO IconIndex=0 >> desktop.txt
ECHO InfoTip= >> desktop.txt
CHCP 1252 >NUL
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > desktop.ini 2>NUL
CMD.EXE /D /U /C TYPE desktop.txt >> desktop.ini
DEL /F /Q desktop.txt
REM two lines above are useless. If I remove them, the icon does not get attached
ECHO %ICONCOPYDIR% > cet.txt
DEL cet.txt
ATTRIB +S +H desktop.ini Icon.ico

大多数时候,它都有效。如果我将文件夹移动到另一个目录中,我可以看到附加的图标。

还有什么

01) 获取子文件夹名称。我设法使用此脚本获得了一个包含路径的列表:

set subfolders=DIR /s /b /o:n /ad
%subfolders%

但我只想获取文件夹名称而不是完整路径。请注意,某些子文件夹的名称可能类似于“04 - 文件夹名称”

02) 使用子文件夹列表(父文件夹)并使这部分主脚本动态化:

之前 --> set child=PARENT1 之后 --> set child=%parentname%

03) 上一步需要每个子文件夹名称的 for 循环。

因此,考虑到作为第一步,我想更改父母的图标,我需要一个 for 循环,并且在获得所有父母名称后,我的脚本应该可以工作。

【问题讨论】:

    标签: batch-file icons


    【解决方案1】:

    有问题的批处理文件的目的对我来说很神秘。

    第二行CD "%cd%" 完全没用。将当前目录更改为当前目录?这个命令的目的应该是什么?

    有三个ECHO命令行输出重定向到文件cet.txt覆盖这个文件,以防在cet.txt最终被删除之前已经存在而不被使用。所以cet.txt的四行也完全没用。

    在删除所有带有cet.txt 的四行之后,带有set startdir=%cd% 的第三行也不再有用,因为不再使用环境变量startdir

    然后是两条命令行:

    set MYDIR=%cd%
    set MYDIR1=%MYDIR:~0%
    

    在命令提示符窗口中运行这两个命令,然后在命令 set MYDIR 下运行应该清楚地表明第二个命令行与 set MYDIR1=MYDIR 相同,这很可能不是这里真正想要的。

    因此命令行

    for %%f in (%MYDIR1%) do set myfolder=%%~nxf
    

    相同
    for %%f in (%CD%) do set myfolder=%%~nxf
    

    其中环境变量myfolder 将仅用于将其值写入文件ccc.txt,如果该行未使用注释命令REM 完全注释掉,则不会进一步使用该文件。

    剩下的命令行也没什么意义。

    所以我在这里停止描述提供的代码有什么问题,并在示例中提出完全不同的建议。

    文件夹C:\Temp\Test 包含以下文件夹和文件:

    • 父母1
      • 孩子1
        • 图标.ico
      • desktop.ini
    • 父母2
      • 孩子2
        • 孙子 1
        • 孙子 2
          • desktop.ini
          • 图标.ico
        • desktop.ini
        • 图标.ico
      • 图标.ico
    • 父母3
      • 孩子3
        • desktop.ini
        • 图标.ico
      • desktop.ini
      • 图标.ico
    • UpdateIcons.bat

    文件夹C:\Temp\TestUpdateIcons.bat的任务描述。

    1. 检查当前目录的每个子目录是否包含文件Icon.ico,该文件也可以是隐藏文件。
      这意味着在此示例中检查 Parent1Parent2Parent3 目录中的 Icon.ico

    2. 如果当前目录的子目录包含Icon.ico,则
      a)从该子目录的所有子目录中删除所有Icon.ico
      b) 从此子目录及其所有子目录中删除 desktop.ini
      c) 从此子目录及其所有子目录中删除系统属性。

    3. 但如果当前目录的子目录中有Icon.ico,则
      a)将此子目录的Icon.ico复制到其所有子目录,
      b ) 在此子目录及其所有子目录中创建desktop.ini(如果尚不存在),
      c) 在此子目录及其所有子目录中设置系统属性。

      李>

    C:\Temp\Test为当前目录运行C:\Temp\Test\UpdateIcons.bat后的预期结果:

    • 父母1
      • 孩子1
    • 父母2
      • 孩子2
        • 孙子 1
          • desktop.ini
          • 图标.ico
        • 孙子 2
          • desktop.ini
          • 图标.ico
        • desktop.ini
        • 图标.ico
      • desktop.ini
      • 图标.ico
    • 父母3
      • 孩子3
        • desktop.ini
        • 图标.ico
      • desktop.ini
      • 图标.ico
    • UpdateIcons.bat

    所有desktop.iniIcon.ico 都应该设置隐藏和系统属性。 C:\Temp\Test 的所有目录(Parent1Child1 除外)都应设置系统属性。并且Parent1Child1 应该不再设置系统属性。 Parent2 中的所有 Icon.ico 及其子目录都应该有一些二进制数据。在运行批处理文件后,Parent3Child3 中的所有 Icon.ico 也应该相同。

    对于该任务,UpdateIcons.bat 可能包含以下命令行:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    set "IconFile=Icon.ico"
    
    rem Environment variable CD holds path to current directory not ending with
    rem a backslash except the current directory is the root of a drive. Get the
    rem current directory path as base folder path always without a trailing
    rem backslash. The variable BaseFolder is used only for printing the
    rem currently processed folder on execution of most outer loop.
    
    if "%CD:~-1%" == "\" ( set "BaseFolder=%CD:~0,-1%" ) else ( set "BaseFolder=%CD%" )
    
    rem Run the commands on each subfolder in current folder which can
    rem be also hidden folders. Therefore command DIR is used instead
    rem of FOR /D which would ignore hidden folders.
    
    for /F "eol=| delims=" %%I in ('dir /AD /B * 2^>nul') do (
        if not exist "%%I\%IconFile%" (
    
            rem Delete all desktop.ini and folder icon files from this
            rem folder and all subfolders and remove system attribute
            rem from this folder and all subfolders.
    
            echo No %IconFile% in folder:    "%BaseFolder%\%%I"
            %SystemRoot%\System32\attrib.exe -s "%%I"
            for /F "eol=| delims=" %%J in ('dir /A-D /B /S "%%I\desktop.ini" "%%I\%IconFile%"') do (
                %SystemRoot%\System32\attrib.exe -h -r -s "%%J"
                del "%%J"
            )
            for /F "delims=" %%J in ('dir /AD /B /S "%%I\*"') do %SystemRoot%\System32\attrib.exe -s "%%J"
    
        ) else (
    
            rem Copying this icon to all subfolders and create in this folder
            rem and all subfolders the file desktop.ini. Additionally set the
            rem system attribute on this folder and all subfolders.
    
            echo %IconFile% found in folder: "%BaseFolder%\%%I"
            if not exist "%%I\desktop.ini" (
                echo [.ShellClassInfo]
                echo ConfirmFileOp=0
                echo NoSharing=1
                echo IconFile=%IconFile%
                echo IconIndex=0
                echo InfoTip=
            ) >"%%I\desktop.ini"
            %SystemRoot%\System32\attrib.exe +s "%%I"
            %SystemRoot%\System32\attrib.exe -a +h -r +s "%%I\desktop.ini"
            %SystemRoot%\System32\attrib.exe -a +h -r +s "%%I\%IconFile%"
            for /F "delims=" %%J in ('dir /AD /B /S "%%I\*"') do (
                %SystemRoot%\System32\xcopy.exe "%%I\%IconFile%" "%%J\" /C /H /Q /Y >nul
                if not exist "%%J\desktop.ini" (
                    echo [.ShellClassInfo]
                    echo ConfirmFileOp=0
                    echo NoSharing=1
                    echo IconFile=%IconFile%
                    echo IconIndex=0
                    echo InfoTip=
                ) >"%%J\desktop.ini"
                %SystemRoot%\System32\attrib.exe +s "%%J"
                %SystemRoot%\System32\attrib.exe -a +h -r +s "%%J\desktop.ini"
                %SystemRoot%\System32\attrib.exe -a +h -r +s "%%J\%IconFile%"
            )
        )
    ) 2>nul
    endlocal
    

    这个例子的批处理文件的输出是:

    No Icon.ico in folder:    "C:\Temp\Test\Parent1"
    Icon.ico found in folder: "C:\Temp\Test\Parent2"
    Icon.ico found in folder: "C:\Temp\Test\Parent3"
    

    FOR 命令忽略设置了隐藏属性的文件夹和文件。因此,有必要将命令 DIR/A-D(仅具有任何属性的文件)或/AD(仅具有任何属性的目录)一起使用。

    在搜索文件夹或文件、复制图标文件、创建desktop.ini 或更改文件夹和文件的属性(拒绝访问)时可能出现的所有错误消息都被重定向句柄抑制STDERR 到设备 NUL 用于整个最外层循环。

    要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

    • attrib /?
    • del /?
    • dir /?
    • echo /?
    • endlocal /?
    • for /?
    • if /?
    • rem /?
    • set /?
    • setlocal /?
    • xcopy /?

    另请参阅有关 Using command redirection operators 的 Microsoft 文章。

    【讨论】:

    • 我过去还写了一个更智能的文件夹图标更新批处理文件解决方案作为答案:How to get file name of an icon file in a folder for creating/updating desktop.ini for folder(s)?
    • 在Win10中使用我的脚本甚至FolderMarker软件(过去我没有问题),有时附件可以工作,有时不能。有时,如果我等待 2-3 分钟,我可以看到图标。在其他情况下,我不得不删除 thumbs.db 文件并且它起作用了。在其他情况下,我只是在文件夹中复制了一个随机的 thumbs.db 文件,然后我看到了图标。这很奇怪(Windows 价值对我来说很低)。我没有使用具有网络共享的批处理文件。我没有以管理员身份运行该文件。也许批处理文件不是最好的解决方案。我想不出别的了。
    • 嗯,Windows资源管理器的文件夹、文件和符号缓存不受批处理文件的控制。由 Windows 资源管理器更新其缓存以更新文件夹显示。
    • 你认为批处理文件不是解决方案吗?我将尝试创建更多脚本,以便(例如)根据名称将图像等文件移动到特定文件夹中。例如,图像“1990 - France - Ferrari - Alain Prost”将移动到“1990”文件夹内的子文件夹“France”中。
    • 根据我的经验,Windows 资源管理器识别目录中的更改不如 Total Commander 等其他文件管理器。但用户可以按 F5 键重新读取活动目录并刷新显示。但是文件重命名、移动、删除……(标准文件/文件夹操作)通常可以被资源管理器很好地检测到。用于文件夹显示的 Windows 资源管理器无法识别desktop.iniicon.ico 和系统属性的更改,这不是批处理文件的错。我不认为使用任何其他脚本语言对这个问题有影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2013-04-12
    • 2016-10-23
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多