Windows 在循环中执行每个命令后执行操作
成功完成提取后,我想删除给定文件夹中的所有文件(errorlevel 0)。有多个文件夹,其中有多个7z拆分文件,仅当提取成功时,我想从文件夹1中删除所有7z文件,然后继续从文件夹2中提取文件,然后(再次)如果提取成功,则删除该文件夹中的所有7z文件,依此类推 我现在有这样的东西:Windows 在循环中执行每个命令后执行操作,windows,batch-file,cmd,Windows,Batch File,Cmd,成功完成提取后,我想删除给定文件夹中的所有文件(errorlevel 0)。有多个文件夹,其中有多个7z拆分文件,仅当提取成功时,我想从文件夹1中删除所有7z文件,然后继续从文件夹2中提取文件,然后(再次)如果提取成功,则删除该文件夹中的所有7z文件,依此类推 我现在有这样的东西: FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg" if %errorlevel% EQU 0 del "%%g" FOR /R E:\t
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg"
if %errorlevel% EQU 0 del "%%g"
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg" & if %errorlevel% EQU 0 del "%%g"
所以只有在整个循环完成后,它才会开始执行删除操作,我不希望这样做。我希望在成功完成每次提取时触发删除
如果我这样设置批次:
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg"
if %errorlevel% EQU 0 del "%%g"
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg" & if %errorlevel% EQU 0 del "%%g"
我得到了一些我想要的东西,因为批处理在每次提取之后开始执行删除,但它也做得不对。
如果我在E:\tmp\中有一个名为“Test”的文件夹,其中有文件Test.7z.001到Test.7z.003,则批开始提取Test.7z.001,然后继续仅删除Test.7z.001,然后开始尝试提取文件Test.7z.002,如果失败,它只继续删除文件Test.7z.002,该文件不应该删除,因为它提取失败,这也告诉我-如果设置不正确,文件Test.7z.003也会发生同样的情况
当批处理开始时,在cmd窗口中已经可以看到这样的内容:
FOR /R E:\tmp\ %g IN (*.7z.*) DO 7z x "%~dpng.001" -o"%~dpg" & if 0 EQU 0 del "%g"
7z x "E:\tmp\Test 3\test3.7z.001" -o"E:\tmp\Test 3\" & if 0 EQU 0 del "E:\tmp\Test 3\test3.7z.001"
它已经暗示errorlevel为0,而无需等待提取开始,因此无论执行什么删除操作。我猜它从批处理的执行结果而不是7z操作中获取errorlevel。
我对批处理知之甚少,只知道一些基础知识和一些我在必要时学到的东西,批处理循环对我来说是新的。抱歉,如果我的英语不好,我也不知道如何表达标题。变量在执行时展开。因此,
%errorlevel%
已解析为上一个执行的命令。所以当你把所有的东西都放在一条线上时,它真的不是你想象的那样工作。还要记住,您使用的是两个不同的示例。一个来自批处理文件,另一个来自命令行,因此执行此操作时,情况可能会略有不同
你应该考虑使用括号,不管是从命令提示符还是在批处理文件中执行。使用
IF ERRORLEVEL
语法也将有助于您实现这一点
所以你有几个选择
从批处理文件
FOR /R E:\tmp\ %%g IN (*.7z.*) DO (
7z x "%%~dpng.001" -o"%%~dpg"
if not errorlevel 1 del "%%g"
)
您还可以在批处理文件中使用条件执行,全部在一行中。在本例中,使用双符号AND将表示上一个命令是否成功,然后执行下一个命令。再次使用括号将命令分组在一起
FOR /R E:\tmp\ %%g IN (*.7z.*) DO (7z x "%%~dpng.001" -o"%%~dpg" && del "%%g")
变量在执行时展开。因此,
%errorlevel%
已解析为上一个执行的命令。所以当你把所有的东西都放在一条线上时,它真的不是你想象的那样工作。还要记住,您使用的是两个不同的示例。一个来自批处理文件,另一个来自命令行,因此执行此操作时,情况可能会略有不同
你应该考虑使用括号,不管是从命令提示符还是在批处理文件中执行。使用
IF ERRORLEVEL
语法也将有助于您实现这一点
所以你有几个选择
从批处理文件
FOR /R E:\tmp\ %%g IN (*.7z.*) DO (
7z x "%%~dpng.001" -o"%%~dpg"
if not errorlevel 1 del "%%g"
)
您还可以在批处理文件中使用条件执行,全部在一行中。在本例中,使用双符号AND将表示上一个命令是否成功,然后执行下一个命令。再次使用括号将命令分组在一起
FOR /R E:\tmp\ %%g IN (*.7z.*) DO (7z x "%%~dpng.001" -o"%%~dpg" && del "%%g")
已经向您展示了(至少在我看来)实现您的目标的首选方式(使用&&
)
无论如何,为了克服%ErrorLevel%
的问题,他解释说您可以使用以下方法:
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg"
if %errorlevel% EQU 0 del "%%g"
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg" & if %errorlevel% EQU 0 del "%%g"
for/R“E:\tmp”%%g in(*.7z.*)do(
7z x“%%~dpng.001”-o“%%~dpg”
setlocal EnableDelayedExpansion
如果!错误级别!等于0(
endlocal和del“%%g”
)else endlocal
)
我在循环体中切换了延迟扩展,以避免包含字符的%%g
出现问题代码>或^
被延迟扩展消耗
要强制文件顺序为
*.7z.001
,*.7z.002
,*.7z.003
,独立于驱动器的文件系统(例如NTFS或FAT),应将/R的循环更改为:
for/F“delims=“%%g in('dir/S/B/A:-D/O:NE*.7z.*)do(
rem//循环体不受此影响。。。
)
由于您似乎要处理多卷存档,提取*.7z.001
(7z.exe
应识别出存在多个部分并自动提取所有内容)就足够了,然后您可以在成功的情况下删除所有相应的部分:
for/F“delims=“%%g in('dir/S/B/A:-D/O:NE*.7z.001')do(
7z x“%%~fg”-o“%%~dpg”
setlocal EnableDelayedExpansion
如果!错误级别!等于0(
endlocal&del“%%~dpng.*”
)else endlocal
)
已经向您展示了(至少在我看来)实现您的目标的首选方式(使用&&
)
无论如何,为了克服%ErrorLevel%
的问题,他解释说您可以使用以下方法:
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg"
if %errorlevel% EQU 0 del "%%g"
FOR /R E:\tmp\ %%g IN (*.7z.*) DO 7z x "%%~dpng.001" -o"%%~dpg" & if %errorlevel% EQU 0 del "%%g"
for/R“E:\tmp”%%g in(*.7z.*)do(
7z x“%%~dpng.001”-o“%%~dpg”
setlocal EnableDelayedExpansion
如果!错误级别!等于0(
endlocal和del“%%g”
)else endlocal
)
我在循环体中切换了延迟扩展,以避免包含字符的%%g
出现问题代码>或^
被延迟扩展消耗
要强制文件顺序为*.7z.001
,*.7z.002
,*.7