【发布时间】:2019-01-16 11:09:51
【问题描述】:
我有一个小的 python 脚本:
# args.py
import sys; print(sys.argv)
如何编写一个 .bat 包装文件,将所有参数转发到此脚本?
为了从测试中消除我的 shell,我将调用它:
import subprocess
import sys
def test_bat(*args):
return subprocess.check_output(['args.bat'] + list(args), encoding='ascii')
@echo off
python args.py %*
适用于简单情况:
>>> test_bat('a', 'b', 'c')
"['args.py', 'a', 'b', 'c']\n"
>>> test_bat('a', 'b c')
"['args.py', 'a', 'b c']\n"
但在尝试任意字符串时会迅速崩溃:
>>> test_bat('a b', 'c\n d')
"['args.py', 'a b', 'c']\n" # missing d
>>> test_bat('a', 'b^^^^^c')
"['args.py', 'a', 'b^c']\n" # missing ^^^^
甚至可以让bat 文件在其参数未修改的情况下传递吗?
为了证明不是 subprocess 导致问题 - 尝试运行上述
def test_py(*args):
return subprocess.check_output([sys.executable, 'args.py'] + list(args), encoding='ascii')
所有测试都按预期运行
类似问题:
- Get list of passed arguments in Windows batch script (.bat) - 不涉及无损转发
- Redirecting passed arguments to a windows batch file - 解决与我的问题相同的想法,但错误地关闭为上述的副本,并且测试用例不太清楚
- Forwarding all batch file parameters to inner command - 问题不考虑极端情况,接受的答案对他们不起作用
【问题讨论】:
标签: batch-file escaping