我有脚本
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!
)
)
但它没有像我预期的那样工作: 第一个for只执行一次,最后一个echo也会打印在屏幕上。
给定一个文件夹,我需要没有给定文件夹的子文件夹中的文件,而不是将它们分成文件夹和文件
Ex:folder = C:\ test
for会给我文件C:\ test \ test1 \ test2 \ t.txt
我需要test1 \ test2和t.txt
答案 0 :(得分:2)
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
吗?
答案 1 :(得分:1)
当解析器读取你的代码时,你的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