Python 用于批处理的if-do命令的字符串格式在内部不起作用

Python 用于批处理的if-do命令的字符串格式在内部不起作用,python,windows,batch-file,cmd,string-formatting,Python,Windows,Batch File,Cmd,String Formatting,我正在尝试使用os.system()在python脚本中执行windows批处理命令。我的命令看起来像 os.system('''for %i in ("D:\\u\\demo4\\v2\\repository\\..\\p3\\*.aar") do if exist "D:\\u\\demo4\\v2\\repository\\com\\aws\sdk\\%~ni\\%~nxi" copy "%~i" "D:\\u\\demo4\\v2\\repository\\com\\aws\sdk\\%

我正在尝试使用os.system()在python脚本中执行windows批处理命令。我的命令看起来像

os.system('''for %i in ("D:\\u\\demo4\\v2\\repository\\..\\p3\\*.aar") do if exist "D:\\u\\demo4\\v2\\repository\\com\\aws\sdk\\%~ni\\%~nxi" copy "%~i" "D:\\u\\demo4\\v2\\repository\\com\\aws\sdk\\%~ni\\%~ni.aar" /Y ''')
# it works fine...when path "D:\\u\\demo4\\v2\\repository" is hard coded
.这个很好用。但是,现在我的要求是,我希望将其作为变量“REPO_path”传递,而不是硬编码目录路径,并使用python的字符串格式功能在命令中传递此路径。因此,我的命令应该是

os.system('''for %i in ("{}\\..\\p3\\*.aar".format(REPO_PATH)) do if exist "{}\\com\\aws\\sdk\\%~ni\\%~nxi".format(REPO_PATH) 
 copy "%~i" "{}\\com\\aws\sdk\\%~ni\\%~ni.aar".format(REPO_PATH) /Y ''')`
令我惊讶的是,这个命令不起作用。我也包括了我的python脚本文件。我在这里错过了什么??任何帮助。下面显示了我的Python脚本文件,以及命令旁边作为注释获得的输出

import os,sys
REPO_PATH="D:\\u\\demo4\\v2\\repository"
print(REPO_PATH)


os.system('''for %i in ("D:\\u\\demo4\\v2\\repository\\..\\p3\\*.aar") do if exist "D:\\u\\demo4\\v2\\repository\\com\\aws\sdk\\%~ni\\%~nxi" copy "%~i" "D:\\u\\demo4\\v2\\repository\\com\\aws\sdk\\%~ni\\%~ni.aar" /Y ''')
# it works fine...when path "D:\\u\\demo4\\v2\\repository" is hard coded


os.system('''for %i in ("{}\\..\\p3\\*.aar".format(REPO_PATH)) do if exist "{}\\com\\aws\sdk\\%~ni\\%~nxi".format(REPO_PATH) copy "%~i" "{}\\com\\aws\sdk\\%~ni\\%~ni.aar".format(REPO_PATH) /Y ''')
#it gives error saying  ""{}\..\p3\*.aar".format was unexpected at this time."


这根本不是将文件名传递给shell的安全方法。但是忽略这一点,直接的问题是您将
.format(REPO_PATH)
放在shell代码中,而它需要由Python解释器执行,而不是由
cmd.exe
执行

比较:

# your original code, with print() instead of os.system(), to show the bug
REPO_PATH="D:\\u\\demo4\\v2\\repository"
print('''for %i in ("{}\\..\\p3\\*.aar".format(REPO_PATH)) do if exist "{}\\com\\aws\sdk\\%~ni\\%~nxi".format(REPO_PATH) copy "%~i" "{}\\com\\aws\sdk\\%~ni\\%~ni.aar".format(REPO_PATH) /Y ''')


…您将看到,前者在传递给shell的脚本文本中包含
.format(REPO_PATH)
,而后者实际上在调用shell之前替换实例。

这根本不是将文件名传递给shell的安全方法。但是忽略这一点,直接的问题是您将
.format(REPO_PATH)
放在shell代码中,而它需要由Python解释器执行,而不是由
cmd.exe
执行

比较:

# your original code, with print() instead of os.system(), to show the bug
REPO_PATH="D:\\u\\demo4\\v2\\repository"
print('''for %i in ("{}\\..\\p3\\*.aar".format(REPO_PATH)) do if exist "{}\\com\\aws\sdk\\%~ni\\%~nxi".format(REPO_PATH) copy "%~i" "{}\\com\\aws\sdk\\%~ni\\%~ni.aar".format(REPO_PATH) /Y ''')


…您将看到前者在传递给shell的脚本文本中有
.format(REPO\u PATH)
,而后者实际上是在调用shell之前替换实例。

这根本不是bash命令--cmd是一个完全不相关的shell,其语法甚至不在同一个系列中。@charls我已经尝试过这种方法,但是。打印的路径与预期的一样如果您希望Python格式化类似printf的内容,例如,
%i
,使用
%
操作符并提供一些数据:
'hello%s''%world'
@AbhijotMann,那么无论您尝试了什么,都不能准确地表示您的代码实际执行的操作。运行我答案第一部分中的代码(这是从您的问题中复制和粘贴的,唯一的变化是从
os.system
切换到
print
)并查看其输出。@AbhijotMann,…顺便说一句,请注意,通常在将数据替换为shell命令而不引入安全风险之前,这些数据需要引用。对于UNIX平台,
shlex.quote()
是在Python3中实现这一点的正确方法;我不是Windows专家,所以我不能告诉你正确的做法是什么。这根本不是bash命令--
cmd
是一个完全不相关的shell,其语法甚至不在同一个系列中。@charls我已经尝试过这种方法,但是。打印的路径与预期的一样如果您希望Python格式化类似printf的内容,例如,
%i
,使用
%
操作符并提供一些数据:
'hello%s''%world'
@AbhijotMann,那么无论您尝试了什么,都不能准确地表示您的代码实际执行的操作。运行我答案第一部分中的代码(这是从您的问题中复制和粘贴的,唯一的变化是从
os.system
切换到
print
)并查看其输出。@AbhijotMann,…顺便说一句,请注意,通常在将数据替换为shell命令而不引入安全风险之前,这些数据需要引用。对于UNIX平台,
shlex.quote()
是在Python3中实现这一点的正确方法;我不是Windows专家,所以我不能告诉你什么是正确的做法。