如何在 FOR 循环内的批处理文件中包含系统变量?也逃脱了!和 % 在变量中签名?
How to include system variable in batch file inside FOR loop ? also escaping the ! and % sign inside variable?
假设我有一个列表文件,其中包含我想根据列表定期删除的文件夹名称,
目前正在使用此批处理文件,但无法按预期工作:
setlocal enabledelayedexpansion
for /F "tokens=2* delims==" %%x in ('findstr/brc:"foldertodelete" garbagefolderlist.txt') do (
set "foldertodelete=%%x"
set foldertodelete=!foldertodelete:"=!
set foldertodelete=!foldertodelete:%%=^!!"
echo !foldertodelete!
if exist !foldertodelete! (
echo deleting !foldertodelete!
rmdir /s /q !foldertodelete!>nul
)
)
endlocal
里面 garbagefolderlist.txt :
foldertodelete="%programfiles%\blablabla"
fodlertodelete=%systemroot%\blablabla
foldertodelete="C:\Temp"
foldertodelete=D:\Temporary files\here
关于列表文件的说明(garbagefolderlist.txt):
1。文件夹名称可能包含双引号或不,所以我想动态消除批处理文件中的双引号
2。文件夹名称可以是普通的或使用 系统变量或不使用 像 %systemroot%, etc
3。文件夹名称可能包含空格
如果您只想删除该文本文件中列出的文件夹,则只需一行代码。您需要使用 CALL
命令来获取所需的双变量扩展。您甚至根本不需要延迟扩展。
for /F "tokens=2* delims==" %%x in ('findstr /bc:"foldertodelete" garbagefolderlist.txt') do call rmdir /s /q "%%~x" 2>nul
这是您的脚本在我的系统上的执行。我在 Program Files 中创建了一个文件夹,并且在 C: 驱动器上也有一个 Temp 文件夹。不会选择文件中带有 %systemroot% 的行,因为该行有错字。因此脚本只会尝试处理您输入示例中的三行。
我已将回显添加到代码中并将错误转储删除到 nul,以便您可以看到所有输出。
@echo off
for /F "tokens=2* delims==" %%x in ('findstr /bc:"foldertodelete" garbagefolderlist.txt') do (
call echo %%~x
call rmdir /s /q "%%~x"
)
这是该代码的输出。
C:\BatchFiles\SO120676>so.bat
C:\Program Files\blablabla
Access is denied.
C:\Temp
D:\Temporary files\here
The system cannot find the path specified.
所以让我们分解输出。
- 您可以看到 %programfiles% 变量已扩展,因为它正确地回显了文件夹名称,但无法删除该文件夹,因为我不是 运行 来自提升的 cmd 提示符的管理员。所以那个文件夹不能删除。
- 临时文件夹显示正确并被删除。
- 最后一个目录在我的系统上不存在,因为我没有 D: 驱动器,所以系统报告找不到路径。如果标准错误仍被重定向到 NUL 设备,您将看不到该错误,这就是为什么我在删除文件夹之前不费心检查文件夹是否存在的原因。
假设我有一个列表文件,其中包含我想根据列表定期删除的文件夹名称,
目前正在使用此批处理文件,但无法按预期工作:
setlocal enabledelayedexpansion
for /F "tokens=2* delims==" %%x in ('findstr/brc:"foldertodelete" garbagefolderlist.txt') do (
set "foldertodelete=%%x"
set foldertodelete=!foldertodelete:"=!
set foldertodelete=!foldertodelete:%%=^!!"
echo !foldertodelete!
if exist !foldertodelete! (
echo deleting !foldertodelete!
rmdir /s /q !foldertodelete!>nul
)
)
endlocal
里面 garbagefolderlist.txt :
foldertodelete="%programfiles%\blablabla"
fodlertodelete=%systemroot%\blablabla
foldertodelete="C:\Temp"
foldertodelete=D:\Temporary files\here
关于列表文件的说明(garbagefolderlist.txt):
1。文件夹名称可能包含双引号或不,所以我想动态消除批处理文件中的双引号
2。文件夹名称可以是普通的或使用 系统变量或不使用 像 %systemroot%, etc
3。文件夹名称可能包含空格
如果您只想删除该文本文件中列出的文件夹,则只需一行代码。您需要使用 CALL
命令来获取所需的双变量扩展。您甚至根本不需要延迟扩展。
for /F "tokens=2* delims==" %%x in ('findstr /bc:"foldertodelete" garbagefolderlist.txt') do call rmdir /s /q "%%~x" 2>nul
这是您的脚本在我的系统上的执行。我在 Program Files 中创建了一个文件夹,并且在 C: 驱动器上也有一个 Temp 文件夹。不会选择文件中带有 %systemroot% 的行,因为该行有错字。因此脚本只会尝试处理您输入示例中的三行。
我已将回显添加到代码中并将错误转储删除到 nul,以便您可以看到所有输出。
@echo off
for /F "tokens=2* delims==" %%x in ('findstr /bc:"foldertodelete" garbagefolderlist.txt') do (
call echo %%~x
call rmdir /s /q "%%~x"
)
这是该代码的输出。
C:\BatchFiles\SO120676>so.bat
C:\Program Files\blablabla
Access is denied.
C:\Temp
D:\Temporary files\here
The system cannot find the path specified.
所以让我们分解输出。
- 您可以看到 %programfiles% 变量已扩展,因为它正确地回显了文件夹名称,但无法删除该文件夹,因为我不是 运行 来自提升的 cmd 提示符的管理员。所以那个文件夹不能删除。
- 临时文件夹显示正确并被删除。
- 最后一个目录在我的系统上不存在,因为我没有 D: 驱动器,所以系统报告找不到路径。如果标准错误仍被重定向到 NUL 设备,您将看不到该错误,这就是为什么我在删除文件夹之前不费心检查文件夹是否存在的原因。