Пакетное: чтение строк из файла с пробелами в пути - PullRequest
6 голосов
/ 08 декабря 2010

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

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 ]

6 голосов
/ 08 декабря 2010

Документация, которую вы получаете при вводе 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
)
1 голос
/ 08 декабря 2010

Нашли.

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

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

0 голосов
/ 02 мая 2013

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

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

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

...