显示基目录的命名顶级子目录中的所有.txt文件

时间:2018-01-13 18:16:08

标签: batch-file windows-scripting

我有一个基本文件夹C:\Users\user\Desktop\BatchTesting\FTP,里面有多个文件夹。我需要访问FTP文件夹中的5个文件夹,并回显其中的文件名。

我编写了以下代码片段,但遗憾的是它没有显示文件列表:

@echo off
set codeList=Test1,Test2,Test3,Test4,Test5
set source=C:\Users\user\Desktop\BatchTesting\FTP\

setlocal ENABLEDELAYEDEXPANSION

for %%g in (%codeList%) do (

    for /R %source%%%g %%f in (*.txt) do (
        echo %%f
    )
)
endlocal

2 个答案:

答案 0 :(得分:0)

可以使用这个简单的批处理文件:

@echo off
pushd "%USERPROFILE%\Desktop\BatchTesting\FTP"
dir "Test1\*.txt" "Test2\*.txt" "Test3\*.txt" "Test4\*.txt" "Test5\*.txt" /A-D /B /S
popd

或者命令 DIR 在命令提示符窗口中执行:

dir "%USERPROFILE%\Desktop\BatchTesting\FTP\Test1\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test2\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test3\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test4\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test5\*.txt" /A-D /B /S

命令 DIR 输出

    由于/A-D(属性NOT目录),
  • 表示所有文件(包括隐藏文件)
  • 匹配通配符模式*.txt
  • 由于/B(裸格式),
  • 文件名+扩展名
  • 在五个指定的目录及其所有子目录中,并且由于/S而具有完整路径(也在子目录中搜索,导致还打印完整文件路径)。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • popd /?
  • pushd /?

答案 1 :(得分:0)

使用echo off,您的脚本生成以下输出(在更改源以匹配我的测试目录结构之后):

>set codeList=Test1,Test2,Test3,Test4,Test5

>set source=d:\Tmp\Test

>setlocal ENABLEDELAYEDEXPANSION

>for %g in (Test1 Test2 Test3 Test4 Test5) do (for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>endlocal

不是非常有启发性,并且没有简单的方法来插入诊断。重新安排代码以便于诊断:

@setlocal ENABLEEXTENSIONS
@set prompt=$G
@set _codeList=Test1,Test2,Test3,Test4,Test5
@set _source=d:\Tmp\Test\

@for %%g in (%_codeList%) do @call :Recurse %_source%%%g
@exit /b 0

:Recurse
@for /R %1 %%f in (*.txt) do @call :List %%f
@REM @for /f %%f in ('dir /B /S %1\*.txt') do @call :List %%f
@exit /b 0

:List
@echo %%1 == %1
@exit /b 0

当_source指向填充了一些实际文件的正确测试目录时,这恰好正常工作。这是在发布SO问题时如何进行尽职调查的一个示例,通常可以省去发布它的麻烦。

您应该避免使用多行for循环体。您可以为自己创建的问题太多,无法在此枚举。始终调用子例程来完成工作,使调试更容易。使用@<cmd>形式而不是开启/关闭钝回声,还可以更容易地选择性地跟踪脚本并查看如何扩展替换变量。 Recurse子例程显示了两种不同的方法来迭代感兴趣的文件。

我还采用了使用下划线为局部变量添加前缀的习惯。这样,当脚本在我的环境中崩溃并留下垃圾时,我可以使用简单的set _单独查看脚本变量,然后我可以使用for /f "tokens=1 delims==" %f in ('set _') do set %f=清除它们。