我有一个基本文件夹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
答案 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=
清除它们。