Чтобы развернуть ответ @nishaygoyal. Запуск исполняемых файлов (например, docker) в PowerShell отличается от запуска исполняемых файлов в командной строке CMD. В PowerShell аргументы передаются как массив строк , а не как ряд строк, разделенных пробелами, как в приглашении CMD. Следовательно, передавая строку аргументов, разделенных пробелами, PowerShell интерпретирует ее как один аргумент и одну строку.
Следовательно, просто изменяя ваши аргументы в массив строк и перемещая «cp» как один из тех предметов. Все будет работать:
$docker_container_name = "iar_build_container"
$docker_artifacts = "./docker_artifacts"
$cp_arguments = @("cp", `
"$($docker_container_name):C:/docker_work/IAR/Debug", `
"$docker_artifacts/Debug")
docker $cp_arguments
EDIT:
Как указал @Nick, мы должны использовать оператор подвыражения: $($docker_container_name)
в строке, чтобы сделать правильно расширение строки, поскольку PowerShell интерпретирует $docker_container_name:C:
как переменную вместо $docker_container_name
. В PowerShell двоеточие указывает область действия переменной, например $global:foo
. Итак, нам нужно использовать оператор подвыражения $()
, чтобы правильно определить нашу переменную для расширения строки.
Почему использование Start-Process
как это работает?
$cp_arguments = "cp " + $docker_container_name + ":C:/docker_work/IAR/Debug " + `
$docker_artifacts + "/Debug"
Start-Process -FilePath "docker" -ArgumentList "$cp_arguments" -Wait
Ну, согласно Start-Process он особенный в том, что -ArgumentList
может принимать список аргументов, разделенных пробелами, и обрабатывает их в стиле подсказки CMD.
Мы также можем использовать EchoArgs , чтобы точно увидеть, что передается в качестве аргументов:
$docker_container_name = "iar_build_container"
$docker_artifacts = "./docker_artifacts"
#Original:
$cp_arguments = $docker_container_name + ":C:/docker_work/IAR/Debug " + $docker_artifacts + "/Debug"
PS C:\> EchoArgs.exe docker cp "$cp_arguments"
Arg 0 is <docker>
Arg 1 is <cp>
Arg 2 is <iar_build_container:C:/docker_work/IAR/Debug ./docker_artifacts/Debug>
Command line:
"C:\ProgramData\chocolatey\lib\echoargs\tools\EchoArgs.exe" docker cp "iar_build_container:C:/docker_work/IAR/Debug ./docker_artifacts/Debug"
(Обратите внимание, что мы передаем 2 аргумента, cp
и остальную часть строки. Vs. передача массива :
$cp_arguments = @("cp", `
"$($docker_container_name):C:/docker_work/IAR/Debug", `
"$docker_artifacts/Debug")
PS C:\> EchoArgs.exe docker $cp_arguments
Arg 0 is <docker>
Arg 1 is <cp>
Arg 2 is <iar_build_container:C:/docker_work/IAR/Debug>
Arg 3 is <./docker_artifacts/Debug>
Command line:
"C:\ProgramData\chocolatey\lib\echoargs\tools\EchoArgs.exe" docker cp iar_build_container:C:/docker_work/IAR/Debug ./docker_artifacts/Debug
В этом случае вы можете видеть, что он "правильно" разбивает аргументы