gpt4 book ai didi

powershell - 如何使用 Invoke-WebRequest 的 -OutFile 参数转义文件路径中的方括号

转载 作者:行者123 更新时间:2023-12-02 23:07:49 25 4
gpt4 key购买 nike

当您在 [1]File[1].txtInvoke-WebRequest 参数一起使用的文件名中包含类似 -OutFile 的内容时,您会收到错误 Cannot perform operation because the wildcard path File[1].txt did not resolve to a file.
这是由记录的 ​​here 行为引起的。

对于其他 cmdlet,您将使用 -LiteralPath 强制按字面意思采用路径,但在这种情况下,这不是一个选项。

我试过用 ` 或 [ 转义 ]\ 字符,但它仍然给出相同的错误。

为了简化测试,您可以使用 Out-FileTest-Path 等重现相同的问题。

#Fails
Out-File -FilePath "file[1].txt"
Out-File -FilePath "file`[1`].txt"
Out-File -FilePath "file\[1\].txt"

#Succeeds
Out-File -LiteralPath "file[1].txt"

#Fails
Test-Path -Path "file[1].txt"

#Succeeds
Test-Path -LiteralPath "file[1].txt"

我如何转义用于在 -Path-FilePath-OutFile 等中表达通配符的字符,以便它们的功能就像用 -LiteralPath 指定的字符串一样,因为 -LiteralPath 不适用于 Invoke-WebRequest

最佳答案

  • 不幸的是, Invoke-WebRequestInvoke-RestMethod 尚不支持 -LiteralPath ,正如您所说,但 linked GitHub issue 表明将来会添加支持。
  • [] 字符转义为 `[`] 以便在将它们解释为带有 -Path ( -FilePath ) 的通配符表达式时按字面处理,不幸的是,由于底部讨论的错误,目前只有一半有效:
  • 执行转义确保 -Path 参数接受路径(命令不再中断)...
  • ...但在创建文件时,错误地将转义表示用作文字文件名 - 请参阅底部部分。

  • 目前解决 的方法:
  • 使用下面详述的转义...
  • ... 然后重命名文件以删除不需要的 ` 字符。
  • # Literal input path.
    $literalOutFile = 'file[1].txt'

    # Create escaped wildcard-pattern representation that -OutFile accepts.
    $escapedOutFile = [WildcardPattern]::Escape($literalOutFile)

    # Call Invoke-RestMethod -OutFile with the escaped representation.
    'hi' | Out-File -FilePath $escapedOutFile

    # # Rename the resulting file to compensate for the bug discussed below.
    # # !! Note how the *escaped* path must be passed to -LiteralPath, because
    # # !! the bug causes the output file to be created with the *escaped* name.
    Rename-Item -LiteralPath $escapedOutFile ($escapedOutFile -replace '`')

    当错误得到修复时,此代码应该继续工作 - 假设您的文件名从不包含嵌入的文字 ` - 字符。 - 尽管 Rename-Item 调用将是空操作。

    转义 [文字] 路径以用作通配符模式:

    使用以下任何字符串-文字表示形式,最终会产生具有逐字内容 file`[1`].txt 的相同字符串,当解释为通配符表达式时,它是文字字符串 file[1].txt 的转义等效项:
  • 'file`[1`].txt'
  • "file``[1``].txt"
  • file``[1``].txt

  • 要以编程方式创建此转义,请使用:
    $literalName = 'file[1].txt'
    $escapedName = [WildcardPattern]::Escape($literalName) # -> 'file`[1`].txt'

    重要的是目标 cmdlet 将 [] 视为 ` 转义的 -Path ( -FilePath ) 参数,它被传递给它们以便逐字处理。

    如果您使用 "..." 引用或未引用的参数(它的行为通常就像包含在 "..." 中一样),PowerShell 的字符串解析会妨碍: ` 还用作可扩展字符串 ( "..." ) 中的转义字符,因此为了传递 ` 通过,你必须自己转义它,如 ``
  • 否则像 `[ 中的 "..." 会变成 [ - ` 被“吃掉” - 因为从 `[ 的角度来看 [ 是一个转义的 "...",并且转义一个不需要转义的字符就变成了那个字符;简而言之: "file`[1`].txt"file`[1`].txt 都变成了普通的 file[1].txt ,就好像你从未使用过 ` 一样。

  • 相比之下, ` 字符在 '...' 引用的字符串中逐字使用,不需要转义。

    许多带有 -Path 的 cmdlet 的有缺陷的文件创建行为:

    错误 上面提到 - 在文件创建时,转义表示被错误地用作文字文件名 - 影响大多数 cmdlet ,不幸的是:也就是说,他们 在创建文件时意外地保留了转义模式中的 ` 字符 ,这样通过指定 -Path 'file [1 ].txt' 你最终会得到一个名为 file`[1`].txt 的文件。

    幸运的是,大多数 cmdlet 确实支持 -LiteralPath ,因此无论如何使用 -LiteralPath file[1].txt 是更好的选择,并且可以避免此错误。

    一些受影响的 cmdlet:
  • Invoke-WebRequestInvoke-RestMethod
  • Out-File 因此还有 重定向操作符 >>> ,它们在幕后有效地调用了 Out-File
  • 请注意,Set-ContentAdd-Content 不会出现此问题。
  • 所有(?) Export-* cmdlet。
  • 其他?

  • 该错误已在 this GitHub issue 中报告。

    关于powershell - 如何使用 Invoke-WebRequest 的 -OutFile 参数转义文件路径中的方括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55869623/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com