在递归调用中,回显 %%~fF 和回显 %%~fF >>文件有什么区别.txt



我想列出具有给定嵌套级别的子目录。控制台显示工作得很好,但当将相同的echo附加到文件时,它的行为会有所不同。

@echo off
setlocal
set currentLevel=0
set maxLevel=%1
if not defined maxLevel set maxLevel=1

:procFolder
pushd %1 2>nul
if %currentLevel% lss %maxLevel% (
for /d %%F in (*) do (
echo %%~fF
echo %%~fF >> list.txt
set /a currentLevel+=1
call :procFolder "%%F"
set /a currentLevel-=1
)
)
popd

调用参数为3的批处理文件将写入具有预期嵌套的三个子文件夹的shell

D:erroronline1codelearntoshellsub1
D:erroronline1codelearntoshellsub1sub2
D:erroronline1codelearntoshellsub1sub2sub3

但在实际文件中,只记录了第一级递归

D:erroronline1codelearntoshellsub1

这种情况发生在所有可能的子文件夹上,只附加了一级嵌套。我无法控制其他列出子目录的方法(对于(.(中的/r%%F,dir/s(的嵌套级别,所以这不是一个选项。暂停递归(等待文件被写入,不管怎样(或将文件夹传递给变量也没有帮助。

我错过了什么?回声和回声之间可能有什么区别>gt;递归调用中的文件?

pushd更改当前目录。重定向的回显输出被附加到当前目录中的一个文件中。

将日志文件从当前目录更改为完整路径,您将在一个文件中获得所有日志记录,而不是嵌套目录中的几个文件。

您可以使用robocopy实用程序将事情简化为两行批处理文件:

示例:通过传递两个参数来运行它,第一个是目录,第二个是级别数,例如test.cmd"%UserProfile%\Downloads"3

@Set /A Levels = %~2 + 1
@"%__APPDIR__%Robocopy.exe" "%~1" "%~1" /E /L /LEV:%LEVELS% /NC /NS /NFL /NJH /NJS 1> "list.txt"

而且,如果你真的不想要领先的空间:

@Set /A Levels = %~2 + 1
@(For /F Tokens^=* %%G In ('%__APPDIR__%Robocopy.exe "%~1" "%~1" /E /L /LEV:%LEVELS% /NC /NS /NFL /NJH /NJS 2^> NUL') Do @Echo %%G) 1> "list.txt"

[EDIT/]

根据您的评论,这里只修改了一个参数,即test.cmd 3(使用当前目录作为基础(

@Set /A Levels = %~1 + 1
@"%__APPDIR__%Robocopy.exe" . . /E /L /LEV:%LEVELS% /NC /NS /NFL /NJH /NJS 1> "list.txt"

而且,再一次没有领先的空间:

@Set /A Levels = %~1 + 1
@(For /F Tokens^=* %%G In ('%__APPDIR__%Robocopy.exe . . /E /L /LEV:%LEVELS% /NC /NS /NFL /NJH /NJS 2^> NUL') Do @Echo %%G) 1> "list.txt"

如果这是为了重要的事情,请确保首先检查有效的输入参数

最新更新