当标签在里面时,仅对第一个值执行命令

时间:2014-03-06 07:03:34

标签: windows batch-file

我有脚本

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

2 个答案:

答案 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