2015-10-26 2 views
2

Пакетный файл ниже:партии с Ampersand (&) в имени папки

@echo off 
set filelocation=C:\Users\myself\Documents\This&That 
cd %filelocation% 
echo %filelocation% 
pause 

дают следующий результат:

'That' is not recognized as an internal or external command, 
operable program or batch file. 
The system cannot find the path specified. 
C:\Users\myself\Documents\This 
Press any key to continue . . . 

Учитывая я не могу изменить имя папки, как я обрабатывать "&"

ответ

5

Вам нужны два изменения.

1) Расширенный набор синтаксиса с кавычками префикс имени переменной и в конце содержания

2) задержка расширения использовать переменную безопасным способом

setlocal enableDelayedExpansion 
set "filelocation=C:\Users\myself\Documents\This&That" 
cd !filelocation! 
echo !filelocation! 

Задержка expansiuon работает как процентное расширение, но оно должно быть включено сначала с setlocal EnableDelayedExpansion, а затем переменные могут быть расширены восклицательными знаками !variable! и все еще с процентами %variable%.

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

set "var1=This is a percent %%" 
set "var2=This is a percent ^!" 
+0

Ссылки на разницу между "!" и «%» приветствуются. – BuckTurgidson

+0

. Моя рекомендация - оставить командные файлы (сценарии командной оболочки CMD) и переключиться на PowerShell. –

+1

@Bill_Stewart Powershell - это еще один инструмент Microsoft, который сегодня - будущее, и завтра MS представит следующий инструмент, который будет _the future_, а затем powershell устареет, как и все другие инструменты/техника MS. MS никогда не строила ничего надежного в течение 10 или 20 лет, что-то вроде этого существует только в мире Linux – jeb

0

Вот два способа:

а. Цитировать строка; например:

set "filelocation=C:\Users\myself\Documents\This&That" 

b. Используйте escape-символ; например .:

set filelocation=C:\Users\myself\Documents\This^&That 

Чтобы использовать этот путь с командой cd, заключите его в кавычки.

cd /d "%filelocation%" 
+0

Это правильно, но оно решает только первую проблему. – jeb

+0

'set filelocation = C: \ Users \ myself \ Documents \ This^& That' дает ту же ошибку. – BuckTurgidson

+1

Нет, это то же сообщение об ошибке, но теперь это из строки 'cd% filelocation%'. Прежде чем ошибка возникнет в 'set file ...' – jeb

0

В отличие от Jeb, я не думаю, что вам нужно delayed expansion использовать переменную безопасным способом. Правильная цитата может быть достаточной для большинства использования:

@echo off 
SETLOCAL EnableExtensions DisableDelayedExpansion 
set "filelocation=C:\Users\myself\Documents\This&That" 
cd "%filelocation%" 
echo "%filelocation%" 
rem more examples: 
dir /B "%filelocation%\*.doc" 
cd 
echo "%CD%" 
md "%filelocation%\sub&folder" 
set "otherlocation=%filelocation:&=!%" this gives expected result 


SETLOCAL EnableDelayedExpansion 
set "otherlocation=%filelocation:&=!%" this gives unexpected result 
ENDLOCAL 
pause 

Кроме того, это универсальное решение в то время как замедленное расширение может потерпеть неудачу в случае ! восклицательного знака в обрабатываемой строке (например, последняя set команды выше).

+0

Вы правы, вам не нужно замедленное расширение, но использовать переменную безопасным способом почти невозможно с увеличением процента (или, по крайней мере, с вызовом). Как и в ваших примерах, вы использовали цитаты в 'echo '% CD%" ', и это становится очень неприятным, когда в переменной могут быть также кавычки. – jeb

+0

@jeb неприятный или чистый, мне все равно: IMHO двойные цитирования процентных расширенных переменных с ядовитыми символами 'cmd', по-видимому, не менее безопасны, чем те, которые некорректны и'! '-расширены в области с задержкой расширения. Отсроченное расширение может быть полезным (а иногда и необходимым), однако его необходимость здесь не в этом. BTW, volatile variable '% CD%' не может содержать двойные кавычки :) – JosefZ

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