叫窗户'来自python的icacls

时间:2017-07-31 16:46:56

标签: python windows cmd icacls

我已成功使用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.

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

谢谢大家的帮助!!!