我正在尝试在我的计算机上运行一个简单的 icacls 到目录,但遇到了这个错误:PS C:\Users\gguer\Documents> icacls.exe '.\My Digital Editions\'.\My Digital Editions\': 文件...
我正在尝试在我的计算机上运行一个简单的 icacls
目录,但遇到了这个错误:
PS C:\Users\gguer\Documents> 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
正如我所想的那样,我正在使用单引号来转义空格,所以我不知道这里的问题是什么。
您自己的有效解决方法 添加解释 (不包括您的论点中的尾随 \
):
您看到的是 bug in Windows PowerShell 关于如何将参数传递给外部程序的一个错误 - 此问题已 fixed in PowerShell (Core) 7+ .
在后台, PowerShell (of necessity) translates your single -quoted argument containing spaces to a double -quoted form, 因为只能假设外部 CLI 理解 "..."
引用。
大多数 CLI 使用的命令行解析规则将该序列视为 \"
转义 字符 "
,即将该 "
字符视为 参数的 逐字
因此, a verbatim \
at the end of a double-quoted string must itself be escaped as \\
才能被识别 - 这是 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\\"
解决方法 :
p9
【【p10】】
$path = '.\My Digital Editions\'icacls.exe $path.TrimEnd('\') # !! Doesn't work for ROOT paths, e.g. "C:\"
p11
【【p12】】
icacls.exe "$path\"
p13
icacls.exe $(if ($path.EndsWith('\') -and $PSVersionTable.PSEdition -ne 'Core') { "$path\" } else { $path })
另外:
影响 \' 相关错误 会
影响最高 7.2.x 的 PowerShell(核心) - 请参阅 此答案 .