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