Комментарий Джозефа Зи по этому вопросу дает решение:
& "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 решает на основе первого токена оператора, какой режим синтаксического анализа применять:
Если первый токен - это строка в кавычках, которая нам здесь нужна из-за наличия пробелов в пути к исполняемому файлу, или ссылка на переменную em > (например, $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
& "C:/Program Files (x86)/ClamWin/bin/clamd.exe" --install
или используйте апострофы вместо двойных кавычек. - person JosefZ   schedule 28.06.2016&
(тогда как связанный вопрос основан на уже существующем базовом понимании этого и касается расширенного аспекта, который не входит в играть здесь). - person mklement0   schedule 28.06.2016