Ответ 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!