Пакетное: чтение строк из файла с пробелами в пути

Чтобы прочитать строки из файла, в командном файле вы делаете:

for /f %%a in (myfile.txt) do (
    :: do stuff...
)

Теперь предположим, что ваш файл находится в C:\Program Files\myfolder

for /f %%a in ("C:\Program Files\myfolder\myfile.txt") do (
    echo %%a
)

Результат:

C:\Program Files\myfolder\myfile.txt

Это, кажется, интерпретирует данный путь как строку, и, таким образом, %%a это ваш заданный путь.

Ничего об этом в документации, которую я нашел до сих пор. Пожалуйста, кто-нибудь, помогите мне, прежде чем я застрелюсь.

3 ответа

Решение

Документация, которую вы получаете при вводе help for говорит вам, что делать, если у вас есть путь с пробелами.

For file names that contain spaces, you need to quote the filenames with
double quotes.  In order to use double quotes in this manner, you also
need to use the usebackq option, otherwise the double quotes will be
interpreted as defining a literal string to parse.

По умолчанию синтаксис FOR /F это следующее.

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

Этот синтаксис показывает, почему ваш type обходной путь работает. Потому что одинарные кавычки говорят, чтобы выполнить type Команда и цикл по выходу. Когда вы добавляете usebackq опция, синтаксис меняется на это:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

Теперь вы ставите двойные кавычки в пути к файлам, литеральные строки в одинарных кавычках и ставите галочки (серьезные акценты) вокруг команд для выполнения.

Итак, вы хотите сделать это:

for /f "usebackq" %%a in ("C:\Program Files\myfolder\myfile.txt") do (
    echo %%a
)

Нашел это.

for /f %%a in ('type "C:\Program Files\myfolder\myfile.txt"') do (
    echo Deleting: %%a
)

Даже не спрашивайте меня, почему это работает.

Просто поделитесь приведенным ниже кодом, надеясь, что кто-то получит выгоду.

Приведенный ниже код принимает как путь с пробелами, так и, если строки чтения имеют пробелы, он не вызывает проблем с символами после пробела;

FOR / f "tokens = * delims =," %% a in ('type "C: \ Progrem File \ My Program"') do (echo %% a)

Другие вопросы по тегам