Использовать командлет New-Item с Literalpath в Powershell?
Я использую New-Item
Командлет для создания новой папки и неожиданно обнаружить, что она не имеет -Literalpath
параметр доступен. Мой путь содержит квадратные скобки. Что я могу сделать, чтобы решить эту проблему?
2 ответа
Таким образом, это было немного запутанным, что было на самом деле проблема. Таким образом, вам нужно экранировать скобки, точно так же, как вы экранировали бы "\n" в строках - с " ` ". Это создаст папку:
> New-Item -Path 'C:\stuff\powershell\`[test`]' -Name "221" -ItemType "directory"
Но это "молча провалится"
> New-Item -Path 'C:\stuff\powershell\[test]' -Name "221" -ItemType "directory"
Да, удивительно, что New-Item
не имеет параметра, тем более что:
его параметр ведет себя как параметр , т. е. трактует путь как буквальный (дословный).
- Что касается потенциального улучшения в будущем: хотя переименование параметра не является вариантом, чтобы не нарушать обратную совместимость, предположительно
-LiteralPath
может быть введен как псевдоним .
- Что касается потенциального улучшения в будущем: хотя переименование параметра не является вариантом, чтобы не нарушать обратную совместимость, предположительно
за исключением случаев , когда также предоставляется аргумент, и в этом случае аргумент неожиданно обрабатывается как выражение с подстановочными знаками , что, в частности, вызывает проблемы с путями к файлам, которые содержат
[
Такое поведение следует считать ошибкой — см. GitHub issue #17106 .
- Связанная с этим ошибка заключается в том, что путь передается
-Target
(иначе-Value
) также интерпретируется как выражение с подстановочными знаками — см. этот ответ и выпуск GitHub #14534.
- Связанная с этим ошибка заключается в том, что путь передается
Обходной путь - не использовать
-Name
и вместо этого присоедините компонент имени к-Path
аргумент, например, сJoin-Path
# OK - with only a -Path argument, the path is taken *literally*
# Creates a subdir. literally named '[test]' with a file 'test.txt' in it.
New-Item -Force -Path '[test]\test.txt'
# !! BROKEN - with -Name also present, the -Path argument is
# !! interpreted as a *wildcard expression*
New-Item -Force -Path '[test]' -Name 'test.txt'
# WORKAROUND - use -Path only.
New-Item -Force -Path (Join-Path '[test]' 'test.txt')