Folder1和Folder2日志未在批处理文件中正确显示

时间:2017-06-13 06:30:15

标签: loops batch-file recursion directory

这应该很简单,但工作不正常。

FOR /D %%d IN ("D:\Folder*") DO (
    FOR /R "%%d\logs" %%i IN (*) do echo %%i
)
pause

我也尝试过:

FOR /D %%d IN ("D:\Folder*") DO (
    SET fld=%%d
    FOR /R "%fld%\logs" %%i IN (*) do echo %%i
)
pause

我觉得我错过了一些非常基本的东西。

谢谢!

2 个答案:

答案 0 :(得分:3)

第一个代码

FOR /D %%d IN ("D:\Folder*") DO (
    FOR /R "%%d\logs" %%i IN (*) do echo %%i
)

失败,因为您无法在for的文件夹中使用for /r可替换参数。在for解析器的工作方式中,/R中使用的值作为for /d中使用的起始文件夹必须在FOR /D %%d IN ("D:\Folder*") DO ( SET fld=%%d FOR /R "%fld%\logs" %%i IN (*) do echo %%i ) 开始执行之前可用。

第二个代码

%fld%

失败,因为for /d %%d不会按您的意思解析。完整%var%被解析为只有一个命令,并且该命令中的所有%var%引用都被删除,在开始执行之前被存储在变量中的值替换。您无法更改变量的值并在同一命令中检索更改的值,因为在执行时,命令中不包含任何变量扩展,只有解析命令时变量的值。

这通常是在启用延迟扩展时处理的,因此您可以将!var!更改为setlocal enabledelayedexpansion FOR /D %%d IN ("D:\Folder*") DO ( SET "fld=%%d" FOR /R "!fld!\logs" %%i IN (*) do echo %%i ) ,以向解析器指示应该延迟变量扩展(值检索),直到执行命令为止。所以你可以写点像

/R

但由于第一个代码中指出的相同原因,这也不起作用。在解析时需要/R中使用的值。

那么,如何解决这个问题呢?

通过首先将当前活动目录更改为for /D %%i

所迭代的文件夹,您可以避免在for /d %%d in ("d:\Folder*") do ( pushd "%%~fd\logs" && ( for /r %%i in (*) do echo %%i popd ) ) 中指明该文件夹
for /d %%d in ("d:\Folder*") do call :process "%%d"
goto :eof


:process folderPath
for /r "%~1\logs" %%i in (*) do echo %%i
goto :eof

或者您可以将内部循环放在单独的子程序中

for

或者您可以使用for /f处理递归dir

来替换内部递归for /d %%d in ("d:\Folder*") do ( for /f "delims=" %%i in ('dir "%%~fd\logs" /a-d /b /s`) do echo %%i )
private static void factorial(long n) {
    long x = n;
    BigInteger fact = BigInteger.ONE;
    if ((n == 0) || (n == 1)) {
        System.out.println("Factorial is 1");
    } else {
        fact = BigInteger.valueOf(n);
        while (n > 1) {
            fact = fact.multiply(BigInteger.valueOf(n - 1));
            n--;
        }
        System.out.println("Factorial of " + x + " is " + fact);
    }
}

答案 1 :(得分:0)

您也可以简化它。

For /D %%A In ("D:\Folder*") Do Where/R "%%~A" *