PowerShell-передача вычисляемых путей с пробелами
Я пытаюсь сделать что-то очень простое, но не могу понять, где я ошибаюсь. Я нашел много других полезных обсуждений это - особенно здесь - но не нашли ничего, что охватывает мой конкретный сценарий.
в powershell я набрал следующее:
$path = "c:program files"
$path2 = "c:program filesfred2"
echoargs $path $path2
echoargs "$path" "$path2"
в обоих вызовах echoargs, я получаю
Arg 0 is <c:program files" c:program>
Arg 1 is <filesfred2">
назад в результате. Как правильно передать параметры?
NB: в мой реальный скрипт переменные пути построены из нескольких параметров конфигурации, поэтому я не могу просто передать их непосредственно в одинарных кавычках.
2 ответов
вам нужно заключить строки результатов в одинарные кавычки внутри области выполнения:
echoargs "'$path'" "'$path2'"
Это передаст их вызываемому приложению, разделенному внутри одинарных кавычек, но так как вся строка все еще находится в двойных кавычках, ваш параметр будет правильно расширен.
в последней каплей pscx аппликации мы обновили EchoArgs.exe, чтобы также показать всю командную строку, как ее видит получающее приложение. В этом случае вы получаете:
14 > echoargs $path $path2 Arg 0 is c:\program files" c:\program Arg 1 is files\fred2" Command line: "C:\Users\Keith\Documents\WindowsPowerShell\Modules\Pscx\Apps\EchoArgs.exe" "c:\program files\" "c:\program files\fred2 \"
казалось бы \"
приводит к тому, что конечная двойная кавычка где-то экранируется. Кстати, то же самое происходит в CMD.exe из того, что я могу сказать. Если вы изменили свои пути, чтобы удалить конечную косую черту (или если вы использовали прямые косые черты), этого не произойдет.
20 > $path = "c:\program files" 21 > $path2 = "c:\program files\fred2" 22 > echoargs $path $path2 Arg 0 is c:\program files Arg 1 is c:\program files\fred2 Command line: "C:\Users\Keith\Documents\WindowsPowerShell\Modules\Pscx\Apps\EchoArgs.exe" "c:\program files" "c:\program files\fred2"
если вы получаете эти пути откуда-то еще, вы можете удалить обратную косую черту, например:
$path = $path.TrimEnd("\")