2017-01-23 3 views
0

Пример:Сохранение% CD% в переменную, но путь имеет пробелы. Как использовать мою переменную, если путь имеет пробелы?

set mydir=%CD% 

echo %CD% 
C:\Stuff\More Stuff\Lots of Stuff 

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

for /f %G in (%mydir%\file.txt) DO (echo %G) 
+2

Попробуйте: 'for/f% G in ("% mydir% \ file.txt ") do (echo% ~ G)'; кроме того, измените 'set mydir =% CD%' на 'set 'mydir =% CD%" ' – aschipfl

ответ

1

Ключ является правильной цитатой. Следующий синтаксис - единственный безопасный способ установки переменной - если значение не содержит кавычек само по себе, и command extensions are enabled (что по умолчанию по умолчанию, и почти нет ситуаций, когда нарушаются ограничения команд):

set "myDir=%CD%" 

Кавычки не становятся частью ценности таким образом.

Чтобы использовать значение в for /F цикле, как вы пытаетесь сделать ваш вопрос, использовать это (не забудьте удвоить % знаки в пакетном файле):

for /F "usebackq" %G in ("%myDir%\file.txt") do (echo %~G) 

option usebackq теперь требуется для того, для цитируемого пути не следует рассматривать как литеральную строку.


EDIT: Это бывший ответ, прежде чем я заметил /F опцию в команде for.
я не удалить его, потому что может быть полезным в случае, если используется стандартный for цикл:

Чтобы использовать значение в for цикле, как вы пытаетесь сделать ваш вопрос, использовать это (не забудьте удваивать % знаки в пакетном файле):

for %G in ("%myDir%\file.txt") do (echo %~G) 

~ modifier удаляет кавычки из значения.

Чтобы обеспечить расширенное значение всегда в кавычках, используйте:

for %G in ("%myDir%\file.txt") do (echo "%~G") 

В общем, пути всегда должен быть указан для того, чтобы избежать проблем с белыми-пространствами, а также другими специальными символами.Например, %myDir% держит путь, как D:\Docs & Data, командная строка echo D:\Docs & Data повторяет строку D:\DocsПРОСТРАНСТВО и пытается выполнить команду с именем Data, который не существует (скорее всего), потому что & symbol имеет особое значение, а именно для конкатенации две отдельные команды в одной строке. Цитирование пути, такого как echo "D:\Docs & Data", позволяет избежать этой проблемы (хотя кавычки также возвращаются echo, но они игнорируются командами, которые принимают аргументы пути, например cd или copy).

+0

Это не сработало для меня. Вот вывод: ** C: \ Users \ USER \ Desktop \ Batch ** Каталог: ** C: \ Users \ USER \ Desktop \ Тестирование партии ** – NSV

+1

Код в вопросе будет читать файл по очереди, пока они не являются пробелами в имени файла. Помещение котировок вокруг него теперь обрабатывает его как строку, если вы не используете опцию 'usebackq' для чтения файла. Поэтому нам нужно знать, что такое намерения пользователей. – Squashman

+0

@NSV, по умолчанию команда FOR будет использовать пробел как разделитель, чтобы обрезать строку, которую она обрабатывает. Вам просто нужно добавить опцию delims в код, чтобы она не использовала разделителей. 'for/f" delims = "% G in ("% myDir% \ file.txt ") do (echo"% ~ G ")' – Squashman

0

Используйте либо это:

set mydir="%CD%" 

echo %mydir% 

или в случае

set "mydir=%CD%" 

echo "%mydir%" 

for /f "usebackq delims=" %%G in ("%mydir%\file.txt") DO echo %%G 

петли, хотя я не увидел никакой пользы в не используя

echo "%__CD__%" 

for /f "usebackq delims=" %%G in ("%__CD__%file.txt") DO echo %%G 

Зачем устанавливать то, что вам не нужно?

+0

Не повезло ни с одним из них. – NSV

+0

Поскольку они оба работают в нормальных ситуациях, тогда вы должны предоставить больше кода для обоснования своей претензии. _Вы думаете, что вы пытаетесь использовать его в блоке без отложенного расширения. – Compo

+0

Выключает delims = не нужно. – NSV

Смежные вопросы