我正在尝试将一个长而复杂的 Windows 批处理文件转换为 Python。
除了细微的问题外一切正常,我怀疑这与引用有关,但不太清楚。
在批处理文件中,这工作正常:
Reg.exe add "HKCR\7-Zip.zip\shell\open\command" /ve /t REG_SZ /d "\"C:\Program Files\7-Zip\7zFM.exe\" \"%%1\"" /f
这段 Python 代码旨在但没有做同样的事情:
import os, subprocess
cmd = r'Reg.exe add "HKCR\7-Zip.zip\shell\open\command" /ve /t REG_SZ /d "\"C:\Program Files\7-Zip\7zFM.exe\" \"%%1\"" /f'
#os.system(cmd)
subprocess.call(cmd, shell=True)
请注意,(原始)字符串 cmd
和批处理文件完全相同。
os.system() 和 subprocess.call() 的结果相同 - 没有错误(Reg.exe 表示一切正常),但对系统的影响不同。
在我的测试中,批处理文件将归档器 7z 配置为打开 .ZIP 文件本身(正确结果)。
Python 代码导致 7z 打开 .ZIP 所在的文件夹(错误)。
如何让 Python 执行批处理文件的操作?
好的,在黑暗中拍摄:
我会放弃 shell=True
并使用参数列表传递给 subprocess
。报价将自动处理:
cmd = ['Reg.exe','add',r'HKCR\7-Zip.zip\shell\open\command','/ve','/t','REG_SZ','/d',r'"C:\Program Files\7-Zip\7zFM.exe" "%1"','/f']
rc = subprocess.call(cmd)
还要检查 subprocess.call
的返回码
如果你想“自动”处理多个这样的命令,我建议使用 shlex.split
,我并不是说它会解决所有问题,但它在引号方面做得很好(保护引用的参数,引用嵌套):
import shlex
text = r"""Reg.exe add "HKCR\7-Zip.zip\shell\open\command" /ve /t REG_SZ /d "\"C:\Program Files\7-Zip\7zFM.exe\" \"%%1\"" /f"""
print([x.replace("%%","%") for x in shlex.split(text)]) # %% => % in listcomp, add more filters if needed
kết quả:
['Reg.exe', 'add', 'HKCR\\7-Zip.zip\\shell\\open\\command', '/ve', '/t', 'REG_SZ', '/d', '"C:\\Program Files\\7-Zip\\7zFM.exe" "%1"', '/f']
与原始前缀相同的是:
['Reg.exe', 'add', r'HKCR\7-Zip.zip\shell\open\command', '/ve', '/t', 'REG_SZ', '/d', r'"C:\Program Files\7-Zip\7zFM.exe" "%1"', '/f']
很接近吧? :)
Tôi là một lập trình viên xuất sắc, rất giỏi!