Как получить список имен файлов в каталоге и сохранить его в переменной с помощью команд cmd

Мне нужно получить все имена файлов в каталоге и сохранить их в некоторой переменной из командной строки.

Я наткнулся на это

`dir /s /b > print.txt`

но это печатает имена файлов в txt файле.

Как сохранить эти имена в переменной?

Ответ 1

Я предполагаю, что вы действительно имеете в виду пакетный файл 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%)

Если имена файлов не вписываются в одну переменную, вы должны прибегнуть к псевдо-массиву значений, по одному на каждый файл. В приведенном ниже script я использую 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!

Ответ 2

Как сказал @Matt, используйте командный файл.

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