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: В моем реальном script переменные пути создаются из нескольких параметров конфигурации, поэтому я не могу просто передать их непосредственно в одинарных кавычках.
Ответы
Ответ 1
Вам нужно заключить строки результата в одинарные кавычки внутри области выполнения:
echoargs "'$path'" "'$path2'"
Это передаст их вызываемому приложению, заключенному внутри одинарных кавычек, но так как вся строка все еще находится в двойных кавычках, ваш параметр будет правильно расшифрован.
Ответ 2
В последнем падении 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("\")