Использовать командлет 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')
Другие вопросы по тегам