如何获取目录中的文件名列表,并使用cmd命令将其存储在变量中

时间:2013-10-23 11:12:12

标签: batch-file

我需要获取目录中的所有文件名,并将它们存储在命令行的某个变量中。

我遇到了这个

`dir /s /b > print.txt`

但这会将文件名打印到txt文件。

如何将这些名称存储在变量中?

3 个答案:

答案 0 :(得分:22)

我假设你真的是指Windows批处理文件,而不是DOS。

批处理环境变量限制为8191个字符,因此很可能无法将所有文件路径放入一个变量中,具体取决于文件数和平均文件路径长度。

如果文件名包含空格,则应引用它们。

假设它们适合一个变量,您可以使用:

@echo off
setlocal disableDelayedExpansion
set "files="
for /r %%F in (*) do call set files=%%files%% "%%F"

CALL语句相当慢。使用延迟扩展速度更快,但如果启用了延迟扩展,%%F的扩展将损坏包含!的任何值。通过更多工作,您可以拥有快速安全的延迟扩展版本。

@echo off
setlocal disableDelayedExpansion
set "files=."
for /r %%F in (*) do (
  setlocal enableDelayedExpansion
  for /f "delims=" %%A in ("!files!") do (
    endlocal
    set "files=%%A "%%F"
  )
)
(set files=%files:~2%)

如果文件名不适合一个变量,则应该使用伪数组值,每个文件一个。在下面的脚本中,我使用FINDSTR为DIR ouptut的每一行添加一个行号前缀。我使用行号作为数组的索引。

@echo off
setlocal disableDelayedExpansion
:: Load the file path "array"
for /f "tokens=1* delims=:" %%A in ('dir /s /b^|findstr /n "^"') do (
  set "file.%%A=%%B"
  set "file.count=%%A"
)

:: Access the values
setlocal enableDelayedExpansion
for /l %%N in (1 1 %file.count%) do echo !file.%%N!

答案 1 :(得分:4)

正如@Matt所说,使用批处理文件。

setlocal enabledelayedexpansion
set params=
for /f "delims=" %%a in ('dir /s/b') do set params=!params! %%a 

答案 2 :(得分:1)

setlocal enableDelayedExpansion
set /a counter=0
for /f %%l in ('dir /b /s') do (
 set /a counter=counter+1
 set line_!counter!=%%l
)
set line_

如果要将所有内容存储在一个变量中,请检查: Explain how dos-batch newline variable hack works