无法将 icacls 运行到包含空格的目录



我正在尝试对计算机上的目录运行一个简单的icacls,但遇到此错误:


PS C:UsersgguerDocuments> icacls.exe '.My Digital Editions'
.My Digital Editions": The filename, directory name, or volume label syntax is incorrect.
Successfully processed 0 files; Failed processing 1 files

我使用单引号来转义空格,所以我不知道这里有什么问题。

要为您自己的有效解决方法添加解释(不包括参数中的尾随):

你看到的是Windows PowerShell中的一个错误,关于它如何将参数传递给外部程序 - 这个问题已经在PowerShell(Core)7+中得到了修复

在后台,PowerShell(必然)将包含空格的引号参数转换为引号形式,因为只能假定外部 CLI 理解"..."引用。

大多数 CLI 使用的命令行分析规则将序列"视为转"字符,即"字符被视为参数的逐字部分,而不是分隔它。

因此,双引号字符串末尾的逐字本身必须作为\进行转义才能被识别 -这是Windows PowerShell忽略的:

也就是说,Windows PowerShell 按如下方式转换您的调用:

# Resulting command line as used behind the scenes for actual invocation.
# WinPS: BROKEN, because the  at the end isn't escaped.
icacls.exe ".My Digital Editions"

icacls.exe分析此命令行时,它会看到逐字.My Digital Editions"(请注意末尾的逐字"),如错误消息所示。

相比之下,PowerShell(核心)确实执行了必要的转义:

# Resulting command line as used behind the scenes for actual invocation.
# PowerShell (Core): OK
icacls.exe ".My Digital Editions\"

解决方法

  • 文字路径中,只需省略尾随- 但是,这不适用于路径,并且它还假设这不会从目标程序的角度改变参数的含义(它不适用于icacls.exe)。

    • 程序化解决方案:

      $path = '.My Digital Editions'
      icacls.exe $path.TrimEnd('')  # !! Doesn't work for ROOT paths, e.g. "C:"
      
  • 或者 - 也适用于根路径 -手动将尾随加倍

    • 快速而肮脏的编程解决方案,知道文件系统路径可能包含重复的分隔符而不会产生不良影响(但是,它可能会影响路径比较):

      icacls.exe "$path"
      
  • 一个不修改参数的健壮的跨版本编程解决方案有点麻烦:

    icacls.exe $(if ($path.EndsWith('') -and $PSVersionTable.PSEdition -ne 'Core') { "$path" } else { $path })
    

顺便说一句:

影响参数中嵌入"(双引号)传递到外部程序的相关错误会影响PowerShell(核心)至7.2.x - 请参阅此答案。

解决了!只需要删除最后一个反斜杠。干杯。

相关内容

  • 没有找到相关文章

最新更新