这应该很简单,但工作不正常。
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
我觉得我错过了一些非常基本的东西。
谢谢!
答案 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" *