我已成功使用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.
有什么想法吗?
答案 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会过度引用。
谢谢大家的帮助!!!