【问题标题】:Using New-Item cmdlet with Literalpath in Powershell?在 Powershell 中将 New-Item cmdlet 与 Literalpath 一起使用?
【发布时间】:2022-04-05 05:10:29
【问题描述】:

我正在使用New-Item cmdlet 创建一个新文件夹,但意外地发现它没有可用的-Literalpath 参数。我的路径中包含方括号。我该怎么做才能解决这个问题?

【问题讨论】:

  • > New-Item "this is [some] path" -ItemType "directory" 这似乎对我有用。它也适用于完整路径。难道是你在不带括号的情况下尝试这个?括号不在Forbidden characters and names
  • 项目名称中可以有方括号....:New-Item -Path "/the/path/to/your[file]here.txt" -ItemType Directory
  • @Bakudan @Stuart 是的,我可以在新创建的文件/目录的名称中使用方括号,但不能使用-Path。说这个代码New-Item -Path "G:\1\jj[jj]j" -Name "121" -ItemType Directory
  • @preachers New-Item -Path "G:\1\jj[jj]j\jj[dqiw]j" -Type Directory。问题解决了。
  • @Ansgar Wiechers 谢谢。我早该想到的!这很容易。

标签: powershell windows-10 powershell-v5.1


【解决方案1】:

所以,真正的问题是什么有点令人困惑。因此,您需要转义括号,就像 escape "\n" in strings 使用“`”一样。这将创建文件夹:

> New-Item -Path 'C:\stuff\powershell\`[test`]' -Name "221" -ItemType "directory"

但这会“默默地失败”:

> New-Item -Path 'C:\stuff\powershell\[test]' -Name "221" -ItemType "directory"

【讨论】:

  • 单实例没问题。然而,就我而言,New-Item cmdlet 位于一个脚本中,其中包含随机路径。所以逃跑的方式是行不通的。
  • @preachers 那么你应该可以做到>cd [test]>cd '[test]'
  • 这帮助我处理了类似用例中的星号,谢谢!
  • 这是一种有效的解决方法,但请注意 (a) 只有在 also 指定 -Name 时才需要它(仅在 -Path 中指定整个路径即可-is) 和 (b) 它应该从不是必要的,因为该行为应该被视为一个错误 - 请参阅GitHub issue #17106
【解决方案2】:

是的,令人惊讶的是New-Item 没有-LiteralPath 参数,特别是考虑到:

  • 它的 -Path 参数表现得像 -LiteralPath 参数,即,它将路径视为文字(逐字)。

    • 至于潜在的未来增强功能:虽然 重命名 参数不是一个选项以免破坏向后兼容性,但可以想象 -LiteralPath 可以作为 别名 -Path
  • 除了如果还提供了 -Name 参数,在这种情况下,-Path 参数会意外地被视为 wildcard expression,这会导致以下问题包含[的文件路径

    • 这种行为应该被视为一个错误 - 请参阅GitHub issue #17106

      • 一个相关的错误是传递给-Target(又名-Value)参数的路径也被解释为通配符表达式 - 请参阅this answerGitHub issue #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')

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多