我有脚本
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