批处理文件:从目录中读取文件名并在阵列中存储

时间:2017-08-22 05:09:04

标签: batch-file

我正在创建一个批处理文件,其中我需要列出指定文件夹的所有文本文件名,然后从数组中存储和检索它。是否可以在批处理文件中?我列出测试文件的当前代码如下所示

 dir *.txt /b

非常感谢任何帮助。

2 个答案:

答案 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%"