Запуск исполняемого файла с параметрами командной строки в PowerShell - PullRequest
0 голосов
/ 10 мая 2019

Это должно быть возможно. Я могу открыть командную строку в Windows и сделать следующее:

<some exe> <some exe command line parameters>

Должен быть эквивалентный способ сделать это в PowerShell или даже в стандартном пакетном файле Windows. Например, из командной строки Windows я могу запустить Docker-контейнер с:

docker run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0

однако, если я попробую что-то подобное с PowerShell

& "docker" run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0

происходит сбой с общей ошибкой:

invalid reference format.

Возможно, PowerShell не подходит для этого типа расширенного варианта использования. Любые предложения будут оценены!

Есть ли лучший язык сценариев для продвинутых пользователей, подобных этому?

Ответы [ 4 ]

0 голосов
/ 17 мая 2019

Существует много сложностей, связанных с выходом из PowerShell. Я написал этот модуль, чтобы помочь с запуском внешних команд:

https://github.com/choovick/ps-invoke-externalcommand

Демо-версия: https://terminalizer.com/view/49acb54a979

Install-Module -Name ExternalCommand -Scope CurrentUser
Invoke-ExternalCommand -Command "docker" -Arguments @("run","-d","--name=zookeeper","--net=kafka","-e","ZOOKEEPER_CLIENT_PORT=2181", "confluentinc/cp-zookeeper:4.1.0")
0 голосов
/ 10 мая 2019

В общем, внешние программы в 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 .

0 голосов
/ 10 мая 2019

Я думаю, что командлет Start-Process будет полезен. ArgumentList может быть в одинарных или двойных кавычках.

Start-Process docker -ArgumentList "run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0"

0 голосов
/ 10 мая 2019

Вот как это сделать.

$app = 'docker'

$a1 = 'run'

$a2 = '--net=kafka'

$a3 = '-d'

$a4 = '--name=zookeeper'

$a5 = '-e'

$a6 = 'ZOOKEEPER_CLIENT_PORT=2181'

$a7 = 'confluentinc/cp-zookeeper:4.1.0'

& $app $a1 $a2 $a3 $a4 $a5 $a6 $a7
...