Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在循环中执行每个命令后执行操作_Windows_Batch File_Cmd - Fatal编程技术网

Windows 在循环中执行每个命令后执行操作

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

成功完成提取后,我想删除给定文件夹中的所有文件(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:\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