我正在尝试对计算机上的目录运行一个简单的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 - 请参阅此答案。
解决了!只需要删除最后一个反斜杠。干杯。