Мне нужно получить все имена файлов в каталоге и сохранить их в некоторой переменной из командной строки.
Я наткнулся на это
`dir /s /b > print.txt`
но это печатает имена файлов в txt файле.
Как сохранить эти имена в переменной?
Мне нужно получить все имена файлов в каталоге и сохранить их в некоторой переменной из командной строки.
Я наткнулся на это
`dir /s /b > print.txt`
но это печатает имена файлов в txt файле.
Как сохранить эти имена в переменной?
Я предполагаю, что вы действительно имеете в виду пакетный файл 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!
Как сказал @Matt, используйте командный файл.
setlocal enabledelayedexpansion
set params=
for /f "delims=" %%a in ('dir /s/b') do set params=!params! %%a
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_
Если вы хотите сохранить все в одной переменной, проверьте следующее: Объясните, как работает пакетный перенос dos-batch newline