【发布时间】:2018-04-01 19:26:12
【问题描述】:
我正在尝试将一个长而复杂的 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 完成批处理文件的工作?
【问题讨论】:
-
你可以试试
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'] -
这里有需要使用 shell 的原因吗?你没有使用任何 shell 功能,只是执行带有一些参数的命令,所以你只是想弄清楚如何用两层引用而不是这样来对抗......
-
(实际上,将那三层引用而不是一层,因为你也得到了不可避免的注册表字符串引用......)
-
加倍百分比仅在批处理脚本中转义,而不是在交互式或
/c命令中。但是,转义百分比在这里不是问题,因为它没有配对。只需使用一个百分比。 (CMD 没有完全可靠的方法来转义命令行或/c命令上的多个百分比。它的“^”转义字符通常会破坏变量名匹配,但如果变量名以“^”开头,则不会。) -
另外,不要使用 HKCR 设置值。这是一个用于阅读的动态视图。写入 HKCR 的结果取决于“[HKLM|HKCU]\Software\Classes”中已经定义的内容。添加设置时,应在 HKLM 或 HKCU 注册表配置单元中明确定义。