Я хочу выполнить такую ​​внешнюю программу

& $exe $arguments

$ arguments - это строка с пробелами, допустим, ее a b c d

Что происходит, так это то, что аргумент, переданный exe, "a b c d"

Заключить все в двойные кавычки. Этого не происходит, если $ arguments не содержит пробелов.

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

РЕДАКТИРОВАТЬ: Поскольку исправление явно не существует, я работал, преобразовывая каждый бит в массив, и он работает в PS 5. Однако PS4 **** ...

Я хочу иметь аргумент командной строки, который выглядит как -filter:"+[RE*]* +[RR*]*"

PS 4 тоже помещает все в двойные кавычки: $filter = "+[RE*]*", "+[RR*]*" & $opencover -target:"$xunit" "-targetargs:$allPaths $traitsCmd -quiet -nunit xunit-$results -noshadow" -register:user -filter:"$filter" -output:opencover-$results

Если я заменю -filter: на '-filter:', я получу пробел между -filter: и содержимым массива $ filter. Что бы я ни делал, я не могу избавиться от этого, не заключив все в двойные кавычки, например "-filter: ..."

1
Lev 7 Сен 2016 в 12:19

4 ответа

Лучший ответ

Я настоятельно рекомендую использовать Start-Process вместо операторов вызова . и & для вызова внешних исполняемых файлов из PowerShell.

Команда Start-Process намного более предсказуема, потому что вы указываете путь к исполняемому файлу и аргументы командной строки отдельно. В этом нет никакой особой интерпретации (также известной как «магия»).

$MyProcess = Start-Process -FilePath $exe -ArgumentList $arguments -Wait

Я поделился аналогичным советом по нескольким другим потокам StackOverflow.

Powershell "Start-process" не выполняется как запланированная задача

Доступ к выходным данным из Start-Process с параметром -Credential

0
Community 23 Май 2017 в 10:27

При передаче сложных аргументов в exe рассмотрите возможность использования оператора остановки синтаксического анализа: --%. От этого оператора до конца строки «функции» синтаксического анализа PowerShell уходят, и текст анализируется очень аналогично тому, как CMD анализирует текст. Фактически, единственный способ ссылаться на переменные - это путь CMD %var%, например:

77> $env:arguments = 'a b c d'
78> echoargs --% %arguments%
Arg 0 is <a>
Arg 1 is <b>
Arg 2 is <c>
Arg 3 is <d>

Command line:
"C:\Users\Keith\Documents\WindowsPowerShell\Modules\Pscx\3.2.2\Apps\EchoArgs.exe"  a b c d
0
Keith Hill 8 Сен 2016 в 04:01

Вам следует создать массив вместо того, чтобы пытаться. Итак, в вашем случае:

$exe = "ping.exe"
$arguments = "-t","8.8.8.8"
& $exe $arguments

Обратите внимание, что $args - это особое значение, которое не может быть присвоено ничему. Вот почему я использую в своем примере $arguments.

Тогда ответ на ваш вопрос таков:

$arguments = "a","b","c","d"
& $exe $arguments
3
Jonas Andersen 7 Сен 2016 в 09:42

Разделите строку, разделенную пробелами, на массив:

$arguments = "a b c d"
$arguments = $arguments -split '\.'
& $exe $arguments
0
Mathias R. Jessen 7 Сен 2016 в 10:32