Я хочу выполнить такую внешнюю программу
& $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: ..."
4 ответа
Я настоятельно рекомендую использовать Start-Process
вместо операторов вызова .
и &
для вызова внешних исполняемых файлов из PowerShell.
Команда Start-Process
намного более предсказуема, потому что вы указываете путь к исполняемому файлу и аргументы командной строки отдельно. В этом нет никакой особой интерпретации (также известной как «магия»).
$MyProcess = Start-Process -FilePath $exe -ArgumentList $arguments -Wait
Я поделился аналогичным советом по нескольким другим потокам StackOverflow.
Powershell "Start-process" не выполняется как запланированная задача
Доступ к выходным данным из Start-Process с параметром -Credential
При передаче сложных аргументов в 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
Вам следует создать массив вместо того, чтобы пытаться. Итак, в вашем случае:
$exe = "ping.exe"
$arguments = "-t","8.8.8.8"
& $exe $arguments
Обратите внимание, что $args
- это особое значение, которое не может быть присвоено ничему. Вот почему я использую в своем примере $arguments
.
Тогда ответ на ваш вопрос таков:
$arguments = "a","b","c","d"
& $exe $arguments
Разделите строку, разделенную пробелами, на массив:
$arguments = "a b c d"
$arguments = $arguments -split '\.'
& $exe $arguments
Похожие вопросы
Связанные вопросы
Новые вопросы
powershell
PowerShell - это кроссплатформенная утилита командной строки и сценариев от Microsoft. Используйте этот тег только для вопросов о написании и выполнении сценариев PowerShell. Вопросы программирования, относящиеся к кроссплатформенной версии PowerShell Core (Windows, macOS и Linux), должны быть помечены [powershell-core]. Вопросы о системном администрировании следует задавать в случае сбоя суперпользователя или сервера.