Запустить командную строку в PowerShell

Я знаю, что есть много сообщений об этом, но у меня ничего не работало.

Я пытаюсь запустить эту командную строку в PowerShell:

C:/Program Files (x86)/ClamWin/bin/clamd.exe --install

У меня это в PowerShell:

&"C:/Program Files (x86)/ClamWin/bin/clamd.exe --install"

Но все это выполняет clamd.exe, игнорируя параметр --install.

Как мне запустить полную командную строку?


person SSED    schedule 27.06.2016    source источник
comment
Возможный дубликат PowerShell: запустите процесс с аргументами без кавычек   -  person Kory Gill    schedule 28.06.2016
comment
& "C:/Program Files (x86)/ClamWin/bin/clamd.exe" --install или используйте апострофы вместо двойных кавычек.   -  person JosefZ    schedule 28.06.2016
comment
@KoryGill: Хотя связанный вопрос является связанным, этот вопрос отличается тем, что он касается основ синтаксиса & (тогда как связанный вопрос основан на уже существующем базовом понимании этого и касается расширенного аспекта, который не входит в играть здесь).   -  person mklement0    schedule 28.06.2016


Ответы (1)


Комментарий Джозефа Зи по этому вопросу дает решение:

& "C:/Program Files (x86)/ClamWin/bin/clamd.exe" --install # double-quoted exe path

или, учитывая, что исполняемый путь является литералом (не содержит ссылок на переменные или подвыражений):

& 'C:/Program Files (x86)/ClamWin/bin/clamd.exe' --install # single-quoted exe path

Что касается того, почему попытка вашего собственного решения не удалась: оператор вызова & ожидает только имя / путь команды в качестве аргумента, а не полную командную строку.
Invoke-Expression принимает всю командную строку, но это еще больше усложняет ситуацию и может быть угроза безопасности.

Что касается почему, это решение:

  • Необходимость в цитировании очевидна: вам нужно сообщить PowerShell, что C:/Program Files (x86)/ClamWin/bin/clamd.exe является одиночным токеном (путем), несмотря на то, что он содержит встроенный пробелы.

  • &, так называемый оператор вызова необходим, потому что PowerShell имеет два основных режима синтаксического анализа:

    • режим аргумента, который работает как традиционная оболочка, где первый токен - это имя команды, с последующими токенами представляющие аргументы, которые требуют цитирования только в том случае, если они содержат метасимволы оболочки (символы со специальным значением для PowerShell, например пробелы для разделения токенов);
      вот почему --install не нужно < / em>, но можно заключить в кавычки (PowerShell просто удалит кавычки за вас перед передачей аргумента в целевой исполняемый файл.)

    • режим выражения, который работает как выражения в языках программирования.

PowerShell решает на основе первого токена оператора, какой режим синтаксического анализа применять:

Если первый токен - это строка в кавычках, которая нам здесь нужна из-за наличия пробелов в пути к исполняемому файлу, или ссылка на переменную (например, $var ...), PowerShell анализирует в режиме выражения по умолчанию.
Строка в кавычках или ссылка на переменную в качестве выражения просто выводит строка / значение переменной.

Однако, учитывая, что мы хотим выполнить исполняемый файл, путь которого хранится в строке в кавычках, нам нужно принудительно установить режим аргумента, что обеспечивает оператор & .


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

  • Если вы ссылаетесь на переменную PowerShell в командной строке и эта переменная содержит встроенные пробелы, PowerShell неявно заключит значение переменной в двойные кавычки перед передачей это включено - это обсуждается в этом ответе на связанный вопрос.

  • метасимволы в PowerShell отличаются от метасимволов cmd.exe и более многочисленны (в частности, , имеет особое значение в PowerShell (конструктор массива), но не cmd.exe - см. этот ответ).

  • Чтобы упростить повторное использование существующих командных строк на основе cmd.exe, PowerShell v3 представил специальный символ остановки анализа, --%, который отключает обычный синтаксический анализ оставшейся части команды PowerShell. строка и только интерполирует ссылки на переменные среды в стиле cmd.exe (например, %USERNAME%).

person mklement0    schedule 28.06.2016