Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 显示基本目录的命名顶级子目录中的所有.txt文件_Batch File_Windows Scripting - Fatal编程技术网

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

Batch file 显示基本目录的命名顶级子目录中的所有.txt文件,batch-file,windows-scripting,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 ENABLEDELAYEDEXPANSI

我有一个基本文件夹,
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

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

@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
    (属性不是目录)而导致的所有文件(包括隐藏文件)
  • 匹配通配符模式
    *.txt
  • 文件名+扩展名,因为
    /B
    (裸格式)
  • 在五个指定目录及其所有子目录中,并且由于
    /S
    (同时在子目录中搜索,也会打印完整文件路径)而使用完整路径
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

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

关闭echo后,脚本生成以下输出(更改源以匹配我的测试目录结构后):

不是很有启发性,也没有简单的方法插入诊断。重新排列代码以便于诊断:

@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
当源代码指向正确的测试目录,该目录中填充了一些实际的文件时,这恰好起到了作用。这是一个例子,说明在发布SO问题时如何尽职尽责,通常可以省去发布问题的麻烦

应避免对循环体使用多行。你可以为自己制造的问题太多,这里无法列举。总是调用一个子例程来完成这项工作,使调试变得更加容易。使用
@
表单而不是打开/关闭blunt echo,还可以更容易地有选择地跟踪脚本并查看替换变量是如何展开的。递归子例程显示了在感兴趣的文件上迭代的两种不同方式


我还采用了在局部变量前面加下划线的习惯。这样,当脚本崩溃并在我的环境中留下垃圾时,我可以单独查看脚本变量,使用一个简单的
set
,我可以使用
for/f“tokens=1 delims==%f in('set'.')do set%f=

双引号很重要,我建议您使用
%source%%%g”
设置变量的推荐方法是,
设置“var=value”
。此外,您不需要启用延迟扩展,因为您发布的内容不需要延迟扩展。如果您遇到问题,请将
关闭
更改为
打开
在线
1
并添加新的最后一行
暂停
。当你运行脚本时,你应该看到命令和任何错误或遗漏,这样你就可以将它们复制到你的问题中以获得进一步的支持。嘿,我尝试了你上面提到的所有内容,但我仍然没有得到任何输出。必须有输出,除非你自己对其进行评估或将其作为一个问题发布,否则我们无法帮助你!请复习并复习@Comp是正确的,您需要向我们展示一些结果,否则很难确定它为什么不起作用。
@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