有问题的批处理文件的目的对我来说很神秘。
第二行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
-
父母2
-
孩子2
- 孙子 1
-
孙子 2
- desktop.ini
- 图标.ico
- 图标.ico
-
父母3
- UpdateIcons.bat
文件夹C:\Temp\Test中UpdateIcons.bat的任务描述。
检查当前目录的每个子目录是否包含文件Icon.ico,该文件也可以是隐藏文件。
这意味着在此示例中检查 Parent1、Parent2 和 Parent3 目录中的 Icon.ico。
如果当前目录的子目录不包含Icon.ico,则
a)从该子目录的所有子目录中删除所有Icon.ico,
b) 从此子目录及其所有子目录中删除 desktop.ini,
c) 从此子目录及其所有子目录中删除系统属性。
-
但如果当前目录的子目录中有Icon.ico,则
a)将此子目录的Icon.ico复制到其所有子目录,
b ) 在此子目录及其所有子目录中创建desktop.ini(如果尚不存在),
c) 在此子目录及其所有子目录中设置系统属性。
李>
以C:\Temp\Test为当前目录运行C:\Temp\Test\UpdateIcons.bat后的预期结果:
-
父母1
-
父母2
-
孩子2
-
孙子 1
-
孙子 2
- desktop.ini
- 图标.ico
- desktop.ini
- 图标.ico
-
父母3
- UpdateIcons.bat
所有desktop.ini 和Icon.ico 都应该设置隐藏和系统属性。 C:\Temp\Test 的所有目录(Parent1 和 Child1 除外)都应设置系统属性。并且Parent1 和Child1 应该不再设置系统属性。 Parent2 中的所有 Icon.ico 及其子目录都应该有一些二进制数据。在运行批处理文件后,Parent3 和 Child3 中的所有 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 文章。