描述
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%
但我只想获取文件夹名称而不是完整路径。请注意,某些子文件夹可能具有如下名称&#34; 04 - 文件夹名称&#34;
02)使用子文件夹(父项)列表并使主脚本的这一部分动态化:
之前 - &gt; set child=PARENT1
之后 - &gt; set child=%parentname%
03)
上一步需要为每个子文件夹名称使用for循环。
所以,考虑到作为第一步,我想改变父母的图标,我需要一个for循环,在获得所有的父名后,我的脚本应该有效。
答案 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
包含以下文件夹和文件:
文件夹UpdateIcons.bat
中C:\Temp\Test
的任务说明。
检查当前目录的每个子目录,如果子目录包含文件Icon.ico
,该文件也可以是隐藏文件。
这意味着在此示例中检查目录Icon.ico
,Parent1
和Parent2
中的Parent3
。
如果当前目录的子目录不包含Icon.ico
,那么
a)从该子目录的所有子目录中删除所有Icon.ico
,
b)从此子目录及其所有子目录中删除desktop.ini
,
c)从此子目录及其所有子目录中删除系统属性。
但如果当前目录的子目录中有Icon.ico
则为
a)将此子目录的Icon.ico
复制到其所有子目录,
b)在此子目录中创建desktop.ini
及其所有子目录(如果尚未存在),
c)在此子目录及其所有子目录上设置系统属性。
运行C:\Temp\Test\UpdateIcons.bat
且C:\Temp\Test
为当前目录后的预期结果:
所有desktop.ini
和Icon.ico
都应设置隐藏和系统属性。除C:\Temp\Test
和Parent1
之外的所有Child1
目录都应设置系统属性。并且Parent1
和Child1
应该不再设置系统属性。 Icon.ico
及其子目录中的所有Parent2
都应该包含一些二进制数据。运行批处理文件后,Icon.ico
和Parent3
中的所有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。