对于命令,只有当标签在里面时才被执行第一个值

我有脚本

for /f "delims=" %%i in ('dir "%folder%*.txt" /b /s') do ( set s=%%i set s=!s:%folder%=! set new_s=!s:\=! if "x!new_s!" NEQ "x!s!" ( :ProcessListSource For /f "tokens=1* delims=\" %%A in ("!s!") do ( if "%%A" NEQ "" ( if "!Folder1!" NEQ "" ( Set Folder1=!Folder1!\!Name! )else ( Set Folder1=!Name! ) Set Name=%%A ) if "%%B" NEQ "" ( set s=%%B goto :ProcessListSource ) ) echo Folder is: !Folder1! echo Name is: !Name! echo --------------------- ) else ( echo Not a folder !s! ) ) 

但它不会像我所预期的那样工作:第一个只执行一次,而且最后一个回显被打印在屏幕上。

给定一个文件夹,我需要从没有给定文件夹的子文件夹中的文件,并将其分割成文件夹和文件

例如:folder = C:\ test

for会给我文件C:\ test \ test1 \ test2 \ t.txt

我需要test1 \ test2和t.txt

GOTO打破了你的FOR /F \ IF上下文,它们只能被执行一次。

更简单的例子:

 @echo off for /l %%S in (1=1=5) do ( echo %%S goto :inner_label rem :inner_label rem ) 

这将只打印1 。 你真的需要GOTO吗?

当解析器读取你的代码时,for循环中的所有代码都被认为是只有一个命令被解析和执行。 正如npocmaka答案中所述,任何goto调用都会将您从代码的“行”中取出,结束for循环的过程。

这是一个替代方案。 使用pushd + xcopy /l /s命令生成文件的相对路径列表。

 @echo off setlocal enableextensions disabledelayedexpansion set "folder=%cd%" pushd "%folder%" for /f "delims=" %%a in ('xcopy /l /s /y * "%temp%"^|findstr /vbr /c:"[0-9]"' ) do for /f "delims=: tokens=1,*" %%b in ("%%~a") do ( echo [%%c] [%%~nxa] ) popd