В общем, внешние программы в PowerShell называются так же, как и из cmd.exe
- есть различия, из-за того, что PowerShell имеет дополнительные метасимволы, такие как $
и @
, но они не вступают в игру вваш конкретный случай.(Ваш вариант & "docker" ...
тоже будет работать в принципе, но использование &
необходимо, только если вы должны использовать в кавычках или имя команды или путь, основанные на переменной).
Проблема в том, что ваша исходная командная строка содержит два экземпляра –
( EN DASH, U+2013
) вместо ожидаемого диапазона ASCII -
dash (дефис) , который docker
не распознает.
Быстрый способ обнаружить проблему:
# Print the code points of characters outside the ASCII range.
PS> [int[]] [char[]] '& "docker" run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0' -gt 127
8211
8211
Десятичное число 8211
- это шестнадцатеричное.0x2013
, кодовая точка en-dash, тогда как кодовая точка обычного -
- это 45
(0x2d
).
Все, что нужно, это заменить эти –
экземпляры.с -
(и, поскольку docker
не нужно заключать в кавычки, нет необходимости &
):
docker run --net=kafka -d --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0
Ваш собственный ответ показываетРеализация команды на основе переменных, которая является фактически такой же , что и команда выше - если все аргументы известны заранее, никогда не потребуется для использования переменных.
Если вы хотите использовать переменные, гораздо проще использовать переменную одного массива для всех аргументов и передать следующее:
$dockerExe = 'docker'
$dockerArgs = 'run',
'--net=kafka',
'-d',
'--name=zookeeper',
'-e',
'ZOOKEEPER_CLIENT_PORT=2181',
'confluentinc/cp-zookeeper:4.1.0'
& $dockerExe $dockerArgs
Примечание:
Имя исполняемого файла / путь всегда должны указываться отдельно, и если оно заключено в кавычки или включает ссылки на переменные (как в этом случае), &
* оператор вызова должен использоваться для вызова по синтаксическим причинам.
Передача аргументаs как массив, таким образом работает с внешними программами;для команд PowerShell вы должны создать переменную hashtable , передаваемую с символом @
вместо $
, функцией, известной как splatting .