从 python 调用 windows' icacls

calling windows' icacls from python

我已经成功地使用 subprocess.check_output 调用了大量 windows 程序。 然而,我在调用 icacls 时遇到了麻烦。
通过 cmd,这有效:
cmd>icacls "C:\my folder" /GRANT *S-1-1-0:F
我试过:
subprocess.check_output(['C:\Windows\System32\icacls.exe','"C:\my folder"','/GRANT *S-1-1-0:F'],shell=True,stderr=subprocess.STDOUT)
但是 return 代码是 123(根据 microsoft,文件名无效)。
我也尝试过(也适用于 cmd)
subprocess.check_output(['C:\Windows\System32\icacls.exe','"C:/my folder"','/GRANT *S-1-1-0:F'],shell=True,stderr=subprocess.STDOUT)
但是 return 代码也是 123.

有什么想法吗?

不要过度引用您的论点,否则它们将按字面意思传递。让 check_output 在需要时处理引用。使用参数列表的最佳方式:

subprocess.check_output(['icacls.exe',r'C:\my folder','/GRANT','*S-1-1-0:F'],stderr=subprocess.STDOUT)

(请注意,我删除了 shell=True 和命令的路径,并使用原始前缀以避免文件夹参数的反斜杠加倍)

在 Windows 上,您最好为命令行提供一个字符串而不是一个序列,特别是如果您已经确切地知道您想要的命令行是什么样的。传递一个字符串告诉 Python 你知道自己在做什么,它不应该尝试添加引号或以其他方式修改命令:

subprocess.check_output(
    r'C:\Windows\System32\icacls.exe "C:\my folder" /GRANT *S-1-1-0:F',
    stderr=subprocess.STDOUT)

@Jean-François Fabre 给了我线索:
引用我的目标参数是有道理的,因为它有空格,因此,从 cmd 调用时需要引用。但是,似乎 python 会过度引用。

谢谢大家的帮助!!!