批处理笔记(8) - 目录名操作

批量对目录子目录进行加前缀、加后缀、替换字符、删除字符等操作,还有删除空目录。

利用批处理对目录名进行操作。

保存代码到目录名操作.bat执行,将要改动的目录拖放进来,按提示执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
@echo off
@REM @Author: [email protected]
mode con cols=100 lines=38
color 02
title 文件夹操作 by:小可([email protected])
SETLOCAL ENABLEDELAYEDEXPANSION

:GTBegin
cls
@echo 文件夹操作 [前后缀、序数、替换、删除、创建]
@echo --------------------------------------------
@echo 所有操作按回车键 (Enter) 继续
@echo --------------------------------------------
set /p HandleDir=拖一个需处理的文件夹进来:

:GTCONTINUE
cls
@echo 文件夹操作
@echo --------------------------------------------
@echo 当前目录:%HandleDir%
@echo.
@echo -----------------1.加前缀-----------------
@echo 11 - 仅第一层子目录:父目录名-本身目录名
@echo 12 - 第一层下所有层级的目录名:上一层目录名-本身目录名
@echo 13 - 仅第一层子目录:前缀字符-本身目录名
@echo 14 - 第一层下所有层级的目录名:前缀字符-本身目录名
@echo -----------------2.加后缀-----------------
@echo 21 - 仅第一层子目录:本身目录名-后缀字符
@echo 22 - 第一层下所有层级的目录名:本身目录名-后缀字符
@echo -----------------3.替换删除-----------------
@echo 31 - 仅替换第一层子目录名
@echo 32 - 替换第一层级下所有层级的目录名
@echo 33 - 仅删除第一层子目录名
@echo 34 - 删除第一层级下所有层级的目录名
@echo -----------------4.创建目录-----------------
@echo 41 - 创建目录(仅当前目录)
@echo 42 - 创建目录(第一层子目录)
@echo -----------------5.创建文件-----------------
@echo 51 - 创建文件(仅当前目录)
@echo 52 - 创建文件(仅第一层子目录)
@echo 53 - 创建文件(所有子目录)
@echo -------------------其它-------------------
@echo 8 - 重新选择目录
@echo 9 - 退出
@echo.
set GTOperator=9
set /p GTOperator="选择操作数:"
@echo.

if %GTOperator% equ 11 goto GTDIRPREFIX
if %GTOperator% equ 12 goto GTSUBDIRPREFIX
if %GTOperator% equ 13 goto GTDIRPREFIXCUSTOM
if %GTOperator% equ 14 goto GTSUBDIRPREFIXCUSTOM

if %GTOperator% equ 21 goto GTDIRSUFFIX
if %GTOperator% equ 22 goto GTSUBDIRSUFFIX
if %GTOperator% equ 23 goto GTDIRSUFFIXCUSTOM
if %GTOperator% equ 24 goto GTSUBDIRSUFFIXCUSTOM

if %GTOperator% equ 31 goto GTDIRREPLACE
if %GTOperator% equ 32 goto GTSUBDIRREPLACE
if %GTOperator% equ 33 goto GTDIRDEL
if %GTOperator% equ 34 goto GTSUBDIRDEL

if %GTOperator% equ 41 goto GTMKDIR
if %GTOperator% equ 42 goto GTSUBDIRMKDIR

if %GTOperator% equ 51 goto GTMKFILE
if %GTOperator% equ 52 goto GTSUBDIRMKFILE
if %GTOperator% equ 53 goto GTAllSUBDIRMKFILE

if %GTOperator% equ 8 goto GTBegin
if %GTOperator% equ 9 goto GTExit

echo 请选择正确的操作数
pause >nul
goto GTCONTINUE

rem @echo 不能做文件名称的字符
rem @echo \ / : * ? " < > |

rem 11.仅第一层子目录:父目录名-本身目录名
:GTDIRPREFIX
cd /d "!HandleDir!"
for /f "delims=" %%i in ("%cd%") do set "DirNamePrefix=%%~nxi"
for /f "delims=" %%i in ('dir /ad /b 2^>nul') do (
if not "%~nx0"=="%%i" (
ren "%%i" "%DirNamePrefix%-%%~ni"
)
)
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 12.第一层下所有层级的目录名:上一层目录名-本身目录名
:GTSUBDIRPREFIX
cd /d "!HandleDir!"
for /f "usebackq delims=" %%i in (`dir /ad /b /s^|sort /r`) do (
for /f "usebackq delims=" %%j in (`dir /ad /b "%%i\" 2^>nul`) do (
ren "%%i\%%j" "%%~nxi-%%~nj" ) )
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 13.仅第一层子目录:前缀字符-本身目录名
:GTDIRPREFIXCUSTOM
set FilePrefix=""
set /p FilePrefix="前缀字符:"
cd /d "!HandleDir!"
for /f "usebackq delims=" %%i in (`dir /ad/b`) do (
if not "%%i"==%0 ren "%%i" "%FilePrefix%%%~ni")
set FilePrefix=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 14.第一层下所有层级的目录名:前缀字符-本身目录名
:GTSUBDIRPREFIXCUSTOM
set SubFilePrefix=""
set /p SubFilePrefix="前缀字符:"
cd /d "!HandleDir!"
for /f "usebackq delims=" %%i in (`dir /ad /b /s^|sort /r`) do (
for /f "usebackq delims=" %%j in (`dir /ad /b "%%i\" 2^>nul`) do (
ren "%%i\%%j" "!SubFilePrefix!%%~nj"))
set SubFilePrefix=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 21.仅第一层子目录:本身目录名-后缀字符
:GTDIRSUFFIX
set FileSuffix=""
set /p FileSuffix="后缀字符:"
cd /d "!HandleDir!"
for /f "usebackq delims=" %%i in (`dir /ad/b`) do (
if not "%%i"==%0 ren "%%i" "%%~ni%FileSuffix%")
set FileSuffix=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 22.第一层下所有层级的目录名:本身目录名-后缀字符
:GTSUBDIRSUFFIX
set SubFileSuffix=""
set /p SubFileSuffix="后缀字符:"
cd /d "!HandleDir!"
for /f "usebackq delims=" %%i in (`dir /ad /b /s^|sort /r`) do (
for /f "usebackq delims=" %%j in (`dir /ad /b "%%i\" 2^>nul`) do (
ren "%%i\%%j" "%%~nj!SubFileSuffix!"))
set SubFileSuffix=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE


rem 31.仅替换第一层子目录名
:GTDIRREPLACE
cd /d "!HandleDir!"
set /p oldStr=原字符:
set /p newStr=替换成:
for /f "usebackq tokens=*" %%a in (`dir /ad /b`) do (
set "newFileName=%%~nxa"
set "newFileName=!newFileName:%oldStr%=%newStr%!"
ren "%%a" "!newFileName!"
)
set oldStr=""
set newStr=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 32.替换第一层级下所有层级的目录名
:GTSUBDIRREPLACE
cd /d "!HandleDir!"
set /p oldStr=原字符:
set /p newStr=替换成:
for /f "usebackq delims=" %%i in (`dir /ad /b /s^|sort /r`) do (
for /f "usebackq delims=" %%j in (`dir /ad /b "%%i\" 2^>nul`) do (
set "newFileName=%%~nxj"
set "newFileName=!newFileName:%oldStr%=%newStr%!"
ren "%%i\%%j" "!newFileName!"))
set oldStr=""
set newStr=""
set newFileName=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 33.仅删除第一层子目录名
:GTDIRDEL
cd /d "!HandleDir!"
set /p DelStr=删除字符:
for /f "usebackq tokens=*" %%a in (`dir /ad /b`) do (
set "str=%%a"
set "str=!str:%DelStr%=!"
ren "%%a" "!str!"
)
set DelStr=""
set str=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 34.删除第一层级下所有层级的目录名
:GTSUBDIRDEL
cd /d "!HandleDir!"
set /p DelStr=删除字符:
for /f "usebackq delims=" %%i in (`dir /ad /b /s^|sort /r`) do (
for /f "usebackq delims=" %%j in (`dir /ad /b "%%i\" 2^>nul`) do (
set "str=%%~nxj"
set "str=!str:%DelStr%=!"
ren "%%i\%%j" "!str!"))
set DelStr=""
set str=""
echo.
echo :) 搞定(回车继续其它操作)
pause >nul
goto GTCONTINUE

rem 41.创建目录(仅当前目录)
:GTMKDIR
set /p CDirName=目录名:
if "%CDirName%"=="" goto :GTMKDIR
cd /d "!HandleDir!"
md %CDirName%
echo.
echo :) 搞定(回车继续其它操作)!
pause >nul
goto GTCONTINUE

rem 42.创建目录(第一层子目录)
:GTSUBDIRMKDIR
set /p SubCDirName=目录名:
if "%SubCDirName%"=="" goto :GTSUBDIRMKDIR
cd /d "!HandleDir!"
for /f "delims=" %%i in ('dir /b /ad') do (
cd "%%i"
md %SubCDirName%
cd "%%~dpi"
)
echo.
echo :) 搞定(回车继续其它操作)!
pause >nul
goto GTCONTINUE

rem 51.创建文件(仅当前目录)
:GTMKFILE
set /p CFileName=文件名:
if "%CFileName%"=="" goto :GTMKFILE
set CFiledNameExpande="%CFileName%".txt
cd /d "!HandleDir!"
cd.>"%CFiledNameExpande%"
echo.
echo :) 搞定(回车继续其它操作)!
pause >nul
goto GTCONTINUE

rem 52.创建文件(第一层子目录)
:GTSUBDIRMKFILE
set /p SubCFileName=文件名:
if "%SubCFileName%"=="" goto :GTSUBDIRMKFILE
set CFiledNameExpande="%SubCFileName%".txt
cd /d "!HandleDir!"
for /f "tokens=*" %%i in ('dir /b /ad') do cd.>"%%i\%CFiledNameExpande%"
echo.
echo :) 搞定(回车继续其它操作)!
pause >nul
goto GTCONTINUE

rem 53.创建文件(所有子目录)
:GTAllSUBDIRMKFILE
set /p AllSubCFilesName=文件名:
if "%AllSubCFilesName%"=="" goto :GTAllSUBDIRMKFILE
set CFiledNameExpande="%AllSubCFilesName%".txt
cd /d "!HandleDir!"
for /f "tokens=*" %%i in ('dir /b /ad /s') do cd.>"%%i\%CFiledNameExpande%"
echo.
echo :) 搞定(回车继续其它操作)!
pause >nul
goto GTCONTINUE

:GTExit
exit

删除所有空目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
@REM @Author: [email protected]
title 删除所有空目录 by:小可([email protected])
@echo 删除所有空目录(含子目录)
@echo -----------------------------
@ set /p GTConfirm="继续操作吗?(y/n) "

if /i "%GTConfirm:~0,1%"=="y" (
goto GTYES
) else ( goto GTNO )

:GTYES
for /f "delims=" %%i in ('dir /ad /b /s^|sort /r') do rd /q "%%i" 2>nul
@echo :) 操作完成!
pause

:GTNO
exit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Echo Off
@REM @Author: [email protected]
title 删除所有空目录 by:小可([email protected])
SETLOCAL ENABLEDELAYEDEXPANSION
@echo 删除所有空目录(含子目录)
@echo -----------------------------
@ set /p GTConfirm="继续操作吗?(y/n) "
if /i "%GTConfirm:~0,1%"=="y" (
goto GTYES
) else ( goto GTNO )
:GTYES
for /f "delims=" %%i in ('dir /ad /b /s') do call :RdEmptyDir "%%i"
goto :eof
:RdEmptyDir
rd %1 2>nul||goto :eof
set DirPath=%1
for /f "delims=" %%i in (%DirPath%) do (
set DirPath="%%~dpi"
for /f "delims=" %%j in ('dir /ad /b "%%~dpi"')do rd "%%~dpi%%j" 2>nul||goto :eof
)
if "%DirPath:~-2,1%"=="\" set DirPath="%DirPath:~1,-2%"
if /i not "%cd%"==%DirPath% call :RdEmptyDir %DirPath%
goto :eof

:GTNO
exit

(本篇结束)

许可协议:自由转载-保持署名-非商业性使用-禁止演绎 (CC BY-NC-ND 4.0)

By 小可 from https://xinlu.ink/tech/batch-in-action-8-directory-rename.html