Как правильно исключить скобки в пакетном файле Windows?

demo7up спросил: 28 марта 2018 в 04:15 в: windows

Я пытаюсь использовать эти командные строки в пакетном файле Windows:

SET mypath="%programfiles(x86)%\Directory\SubDirectory"
SET app2="com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi^,armeabi-v7a^,x86)(nodpi)_apkmirror.com.apk"If Not Exist "%mypath%\includes\apk\%app2%" (
  Rem DO SOMETHING
) ELSE (
  Rem DO SOMETHING ELSE
)

Но я получаю эту ошибку:

(nodpi)_apkmirror.com.apk was unexpected at this time.

В чем причина этого сообщения об ошибке при выполнении пакетного файла?


1 ответ

Есть решение
Mofi ответил: 28 марта 2018 в 05:42

Пожалуйста, прочитайте мой ответ на Почему не выводится строка с 'echo% var%' после использования 'set var = text' в командной строке? , и вы должны понять, почему это works:

SET "app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk"

Примечание: первая двойная кавычка оставлена ​​для имени переменной.

Команда SET и аргумент:

app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk

, который должен быть заключен в двойные кавычки, чтобы получить пробел, и эти символы &()[]{}^=;!'+,`~<|> интерпретируются как буквенные символы.

Не забудьте ссылаться на переменную окружения app2, заключенную в двойные кавычки, при использовании %app2% или разрешить отложенное расширение и ссылочную переменную app2 с помощью .

Вся строка аргумента, содержащая ссылку на переменную среды !app2!, должна обычно заключаться в двойные кавычки, если она соединяется с другими строками. См. Также Как задать переменные среды с пробелами? В некоторых приложениях, таких как проводник Windows, требуется указывать имя файла / папки в строке аргумента вместо всей строки аргумента. Команда ECHO также является исключением при разборе строки аргумента из стандарта:

Command "argument 1" argument2 "argument 3 with ( and ) in string"
"Path to executable\program.exe" "argument 1" argument2 "argument 3 with ( and ) in string"

Пример:

@echo off
set "mypath=%TEMP%"
set "app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk"
if not exist "%mypath%\includes\apk\%app2%" echo File %mypath%\includes\apk\%app2% does not exist!
pause

Команда IF имеет 4 строки аргумента.

  1. Аргумент 0 - это сама команда IF.
  2. Аргумент 1 - это app2.
  3. Аргумент 2 - это not.
  4. Аргумент 3 - это имя файла с полным путем, которое равно exist и которые должны быть заключены в двойные кавычки, так как содержат пробел и один из этих символов %mypath%\includes\apk\%app2%.

Ну, строка &()[]{}^=;!'+,`~ не содержит пробела или скобок. Но при отладке командного файла видно, что интерпретатор команд Windows расширяет переменные среды во время предварительной обработки всей командной строки IF перед выполнить команду IF. Поэтому имя файла с полным путем, обрабатываемое командой IF, содержит круглые скобки.

Обратите внимание, что не имеет значения, что содержит пакетный файл, открытый в текстовом редакторе. Всегда важно, как выглядит командная строка или весь командный блок, начиная с %mypath%\includes\apk\%app2% и заканчивая соответствием ( после предварительной обработки интерпретатором команд Windows перед выполнением командной строки.

С помощью интерпретатора команд Windows, который ) интерпретирует вывод командного файла при запуске cmd.exe, объясняется в последнем абзаце последней страницы справки о выводе, когда имя файла или папки должно быть включено в двойные кавычки. Строка аргумента, содержащая операторы перенаправления cmd /?, которые должны интерпретироваться как литеральные символы, также должна быть заключена в двойные кавычки. Имя файла / папки не может содержать <|>.

Командные строки в пакетном файле, как указано в вопросе, имеют правильную кодировку:

@echo off
set "mypath=%ProgramFiles(x86)%\MEKNYC\FireMax_Wizard"
set "app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk"if not exist "%mypath%\includes\apk\%app2%" (
  echo File "%mypath%\includes\apk\%app2%" does not exist.
  rem Other commands on missing file.
) else (
  echo File "%mypath%\includes\apk\%app2%" exists.
  rem Other commands on existing file.
)

Вкл. В обеих командных строках ECHO имя файла с полным путем заключено в двойные кавычки, чего не было в предыдущем примере. Причина в том, что <|> и %mypath% в обеих командных строках ECHO заменяются строковыми значениями этих двух переменных среды во время предварительной обработки всего командного блока, начиная с %app2% в командной строке IF и заканчивается на ( в последней командной строке перед выполнением команды IF. Таким образом, первое вхождение ) в имени файла, не заключенном в двойные кавычки, будет интерпретироваться интерпретатором команд Windows как конец блока команды истинного состояния, и в результате будет получено сообщение об ошибке. Предыдущий пример содержит условие IF с простой командой ECHO для выполнения без блока команд, начинающегося с ), и поэтому можно безопасно вывести весь файл имя, не заключая его в двойные кавычки. Тем не менее, я настоятельно рекомендую выводить имена файлов / папок без / с путем с помощью ECHO в окно консоли (не перенаправленное в файл), всегда заключенное в двойные кавычки, поскольку строка файла / папки может содержать также амперсанд (, что снова вызывает проблемы при поиске в командной строке вне строки аргумента в двойных кавычках.

demo7up ответил: 28 марта 2018 в 06:01
Спасибо за подробный ответ, я смог решить мою проблему!