用于将图标附加到子文件夹的批处理文件

时间:2017-01-15 12:03:34

标签: batch-file icons

描述

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

enter image description here

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%

但我只想获取文件夹名称而不是完整路径。请注意,某些子文件夹可能具有如下名称&#34; 04 - 文件夹名称&#34;

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

之前 - &gt; set child=PARENT1 之后 - &gt; set child=%parentname%

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

所以,考虑到作为第一步,我想改变父母的图标,我需要一个for循环,在获得所有的父名后,我的脚本应该有效。

1 个答案:

答案 0 :(得分:2)

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

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

有3个 ECHO 命令行,其输出重定向到文件cet.txt,如果在cet.txt被最终删除之前已经存在而未被使用,则会覆盖此文件。因此cet.txt的所有4行也完全没用。

使用cet.txt删除所有4行后,由于不再使用环境变量set startdir=%cd%,因此使用startdir的第3行不再有用。

然后有两个命令行:

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包含以下文件夹和文件:

  • Parent1
    • Child1
      • Icon.ico
    • 的desktop.ini
  • Parent2
    • CHILD2
      • 孙子1
      • 孙子2
        • 的desktop.ini
        • Icon.ico
      • 的desktop.ini
      • Icon.ico
    • Icon.ico
  • Parent3
    • Child3
      • 的desktop.ini
      • Icon.ico
    • 的desktop.ini
    • Icon.ico
  • UpdateIcons.bat

文件夹UpdateIcons.batC:\Temp\Test的任务说明。

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

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

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

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

    • Parent1
      • Child1
    • Parent2
      • CHILD2
        • 孙子1
          • 的desktop.ini
          • Icon.ico
        • 孙子2
          • 的desktop.ini
          • Icon.ico
        • 的desktop.ini
        • Icon.ico
      • 的desktop.ini
      • Icon.ico
    • Parent3
      • Child3
        • 的desktop.ini
        • Icon.ico
      • 的desktop.ini
      • Icon.ico
    • UpdateIcons.bat

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

    对于该任务,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 root of a drive. Get current
    rem directory path as base folder path always without a trailing backslash.
    rem The variable BaseFolder is used only for printing the currently
    rem processed folder on execution of most outer loop.
    
    if "%CD:~-1%" == "\" ( set "BaseFolder=%CD:~0,-1%" ) else ( set "BaseFolder=%CD%" )
    
    rem Run a commands on each subfolder in current folder which can
    rem be also hidden folders and therefore using command DIR instead
    rem of FOR /D which would ignore hidden folders.
    
    for /F "delims=" %%A in ('dir /AD /B *') do (
        if not exist "%%A\%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%\%%A"
            %SystemRoot%\System32\attrib.exe -s "%%A"
            for /F "delims=" %%B in ('dir /A-D /B /S "%%A\desktop.ini" "%%A\%IconFile%"') do (
                %SystemRoot%\System32\attrib.exe -h -r -s "%%B"
                del "%%B"
            )
            for /F "delims=" %%B in ('dir /AD /B /S "%%A\*"') do %SystemRoot%\System32\attrib.exe -s "%%B"
    
        ) 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%\%%A"
            if not exist "%%A\desktop.ini" (
                echo [.ShellClassInfo]
                echo ConfirmFileOp=0
                echo NoSharing=1
                echo IconFile=%IconFile%
                echo IconIndex=0
                echo InfoTip=
            ) >"%%A\desktop.ini"
            %SystemRoot%\System32\attrib.exe +s "%%A"
            %SystemRoot%\System32\attrib.exe -a +h -r +s "%%A\desktop.ini"
            %SystemRoot%\System32\attrib.exe -a +h -r +s "%%A\%IconFile%"
            for /F "delims=" %%B in ('dir /AD /B /S "%%A\*"') do (
                %SystemRoot%\System32\xcopy.exe "%%A\%IconFile%" "%%B\" /C /H /Q /Y >nul
                if not exist "%%B\desktop.ini" (
                    echo [.ShellClassInfo]
                    echo ConfirmFileOp=0
                    echo NoSharing=1
                    echo IconFile=%IconFile%
                    echo IconIndex=0
                    echo InfoTip=
                ) >"%%B\desktop.ini"
                %SystemRoot%\System32\attrib.exe +s "%%B"
                %SystemRoot%\System32\attrib.exe -a +h -r +s "%%B\desktop.ini"
                %SystemRoot%\System32\attrib.exe -a +h -r +s "%%B\%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 /?

    另请参阅Microsoft TechNet文章Using command redirection operators