echo %%~fF 和 echo %%~fF >> file.txt 在递归调用中有什么区别
what is the difference between echo %%~fF and echo %%~fF >> file.txt within recursive calls
我想列出具有给定嵌套级别的子目录。控制台显示工作正常,但在将相同的回显附加到文件时它的行为不同。
@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:\erroronline1\code\learntoshell\sub1
D:\erroronline1\code\learntoshell\sub1\sub2
D:\erroronline1\code\learntoshell\sub1\sub2\sub3
但在实际文件中只写下了第一级递归
D:\erroronline1\code\learntoshell\sub1
这发生在所有可能的子文件夹中,只是附加了一级嵌套。
我无法使用其他列出子目录的方法(for /r %%F in (.), dir /s)控制嵌套级别,因此这不会作为选项出现。
暂停递归(等待文件被写入,无论如何)或将文件夹传递给变量都没有帮助。
我错过了什么?递归调用中的 echo 和 echo >> file 之间可能有什么区别?
您可以将事情简化为两行 batch-file by using the robocopy 实用程序:
示例:运行 通过传递两个参数,第一个是您的目录,第二个是您的级别数,例如test.cmd“%UserProfile%\下载”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"
[编辑/]
根据您的评论,这里仅针对一个参数进行了修改,即 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"
请确保,如果这是为了任何重要的事情,首先检查有效的输入参数。
pushd 更改当前目录。
重定向的 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:\erroronline1\code\learntoshell\sub1
D:\erroronline1\code\learntoshell\sub1\sub2
D:\erroronline1\code\learntoshell\sub1\sub2\sub3
但在实际文件中只写下了第一级递归
D:\erroronline1\code\learntoshell\sub1
这发生在所有可能的子文件夹中,只是附加了一级嵌套。 我无法使用其他列出子目录的方法(for /r %%F in (.), dir /s)控制嵌套级别,因此这不会作为选项出现。 暂停递归(等待文件被写入,无论如何)或将文件夹传递给变量都没有帮助。
我错过了什么?递归调用中的 echo 和 echo >> file 之间可能有什么区别?
您可以将事情简化为两行 batch-file by using the robocopy 实用程序:
示例:运行 通过传递两个参数,第一个是您的目录,第二个是您的级别数,例如test.cmd“%UserProfile%\下载”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"
[编辑/]
根据您的评论,这里仅针对一个参数进行了修改,即 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"
请确保,如果这是为了任何重要的事情,首先检查有效的输入参数。
pushd 更改当前目录。 重定向的 echo 输出附加到当前目录中的文件。
将日志文件从当前目录更改为完整路径,您将在一个文件中获得所有日志记录,而不是嵌套目录中的多个文件。