1

我已经成功地使用 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)
但返回码是 123(根据 micrsoft,文件名无效)。
我也尝试过(这也适用于 cmd)
subprocess.check_output(['C:\\Windows\\System32\\icacls.exe','"C:/my folder"','/GRANT *S-1-1-0:F'],shell=True,stderr=subprocess.STDOUT)
,但返回码也是 123。

任何想法?

4

3 回答 3

3

不要过度引用你的论点,或者它们是按字面意思传递的。让我们check_output在需要时处理报价。使用参数列表的最佳方法:

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

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

于 2017-07-31T16:48:55.917 回答
0

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

谢谢大家的帮助!!!

于 2017-08-01T09:06:57.107 回答
0

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

subprocess.check_output(
    r'C:\Windows\System32\icacls.exe "C:\my folder" /GRANT *S-1-1-0:F',
    stderr=subprocess.STDOUT)
于 2017-07-31T21:59:21.840 回答