我正在创建一个批处理文件,其中我需要列出指定文件夹的所有文本文件名,然后从数组中存储和检索它。是否可以在批处理文件中?我列出测试文件的当前代码如下所示
dir *.txt /b
非常感谢任何帮助。
答案 0 :(得分:9)
模拟数组
String是批处理文件中唯一的变量类型。但是,可以使用几个相同名称的变量来模拟数组,除了尾随的数字ID,例如:
Array[1] Array[2] Array[3] Array[4] etc...
我们可以将每个文件名存储到这些变量中。
检索命令输出
第一步是将命令输出放入变量中。我们可以使用for /f
循环。
for /f %%G in ('dir *.txt /b') do set filename=%%~G
('')
子句和/f
选项指定收集命令输出。请注意,由于可变覆盖,您获得的文件名始终是显示的最后一个。这可以通过附加来解决,但超出了这个答案的范围。
为文件提供ID
在这种情况下,我会将数组filename
命名为尾随ID [n]
,其中n
是数字ID。
setlocal enableDelayedExpansion
set /a ID=1
for /f "delims=" %%G in ('dir *.txt /b') do (
set filename[!ID!]=%%~G
set /a ID+=1
)
set filename
endlocal
有两点需要注意:
我已将"delims="
添加到循环中,以确保它与默认分隔符一起正常工作。
由于delayed expansion,我将%ID%
替换为!ID!
。简而言之,当禁用延迟扩展时,整个for循环在运行时之前表示,具有新值的变量不是更新块(()
)结构;如果启用,则更新所述变量。 !ID!
表示需要在每个循环中进行更新。
答案 1 :(得分:2)
您可以试试这个批处理文件:
@echo off
Title Populate Array with filenames and show them
set "MasterFolder=%userprofile%\desktop"
Set LogFile=%~dpn0.txt
If exist "%LogFile%" Del "%LogFile%"
REM Iterates throw all text files on %MasterFolder% and its subfolders.
REM And Populate the array with existent files in this folder and its subfolders
echo Please wait a while ... We populate the array with filesNames ...
SetLocal EnableDelayedexpansion
@FOR /f "delims=" %%f IN ('dir /b /s "%MasterFolder%\*.txt"') DO (
set /a "idx+=1"
set "FileName[!idx!]=%%~nxf"
set "FilePath[!idx!]=%%~dpFf"
)
rem Display array elements
for /L %%i in (1,1,%idx%) do (
echo [%%i] "!FileName[%%i]!"
(
echo( [%%i] "!FileName[%%i]!"
echo Path : "!FilePath[%%i]!"
echo ************************************
)>> "%LogFile%"
)
ECHO(
ECHO Total text files(s) : !idx!
TimeOut /T 10 /nobreak>nul
Start "" "%LogFile%"