Windows 编写一个脚本,在批处理脚本中递归列出其中的目录和文件

Windows 编写一个脚本,在批处理脚本中递归列出其中的目录和文件,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在尝试编写一个批处理脚本,递归地列出所有目录及其文件,并使用以下格式键入*.js: 例如,如果我从C:\project目录开始 c:\project project.js project_time.js c:\project\core core.js core_render.js core_application.js 我尝试在代码中实现上述逻辑,如下所示: @echo off for /r %%f in (*.js) do ( echo %%f >> names.tx

我正在尝试编写一个批处理脚本,递归地列出所有目录及其文件,并使用以下格式键入
*.js

例如,如果我从
C:\project
目录开始

c:\project
project.js
project_time.js

c:\project\core
core.js
core_render.js
core_application.js
我尝试在代码中实现上述逻辑,如下所示:

@echo off

for /r %%f in (*.js) do (
  echo %%f >> names.txt
)

pause

我无法打印列出文件的目录。

下面是一个未经测试的示例(如果您的基本目录很大,我不希望它很快):

@Echo关闭
(
对于/F“Delims=“%%G In('Dir/B/S/A:D“C:\Project”2^>NUL'),请执行以下操作:(
%__AppDir_u%where.exe/Q“%%G”:*.js 1>NUL 2>NUL
如果不是错误级别1(
回音/
回声%%G
对于/F“EOL=| Delims=“%%H In(''%\uuuuu AppDir\uuuu%where.exe“%%G”:*.js”)Do(
回声%%~nxH
)
)
)
)1>“names.txt”
暂停
如果希望从命令提示符下运行某些操作,请尝试以下版本:

(For/F“Delims=“%G In('Dir/B/S/AD“C:\Project“2^>NUL”)Do@(%\uuu-AppDir\uuu%where.exe/Q”%G“:*.js>NUL 2>&1&(Echo/&Echo%G&For/F”EOL=| Delims=“%H In(''%\uu-AppDir\uuu%where.exe”%G“:*.js”)Do@Echo%~nxH))>“names.txt”

两种简单的方法:

dir /S *.js
你得到了答案,正如你所要求的

FORFILES /S /M *.js /C "cmd /c echo @path"
您可以获得每个文件的完整路径

@echo off
setlocal disabledelayedexpansion

set "lastdir="

(   for /r %%A in (*.js) do (
        set "nextdir=%%~dpA"

        setlocal enabledelayedexpansion
        if /i not "!lastdir!" == "!nextdir!" (

            rem Empty line and directory path.
            if defined lastdir @echo(
            @echo !nextdir!
        )
        endlocal

        rem Filename.
        @echo %%~nxA

        set "lastdir=%%~dpA"
    )
) > "names.txt"
lastdir
变量用于记录最后一个目录路径,因此它只回显一次

如果
lastdir
不同于
%%~dpA

  • 如果定义了
    lastdir
    ,则将回显空行
  • 找到的文件的目录路径将被回显
文件名总是回显

for
修饰符
dp
是驱动器和路径
nx
是名称和扩展名

setlocal enabledelayedexpansion
仅在需要时使用,因此具有
的路径不易受攻击


我不会建议使用命令行解决方案,因为它会非常长。如果输出格式合适,建议使用
tree
命令。

必须将当前文件路径设置为变量。然后检查该变量是否等于它正在迭代的当前文件。如果不是,则回显文件路径并将变量设置为新的文件路径。
TREE/F
将执行此操作。此外,
powershell-NoLogo-NoProfile-Command“Get ChildItem-Recurse-path.”“
可能会为您提供所需的内容。