蟒窗口从for循环解释的值,以cmd命令

问题描述:

下面是一个代码蟒窗口从for循环解释的值,以cmd命令

from subprocess import Popen, PIPE 

saveerr = sys.stderr 
fsock = open('error.log', 'w') 
sys.stderr = sys.stdout = fsock 

D = {} 

D['\\\\aucb-net-01\\d$'] = '\\\\nasaudc01\\remote_site_sync\\aucb-net-01' 
D['\\\\aupw-file-01\\e$'] = '\\\\nasaudc01\\remote_site_sync\\aupw-file-01' 

for k,v in sorted(D.items()): 
    print (k,":",v) 
    cmd = 'robocopy {} {} /E /MIR /W:2 /R:1'.format(k,v) 
    p = Popen(cmd, stdout=PIPE, bufsize=1, universal_newlines=True) 
    for line in p.stdout: 
     print(line) 

我想,插入“K”的在CMD的值和“V” ROBOCOPY命令后,使之与在for循环它将为在字典d提到的所有源和目标执行ROBOCOPY = {}

我还要在error.log中文件在ROBOCOPY输出日志失败的脚本检查

  Total Copied Skipped Mismatch FAILED Extras 
Dirs :  2575   0  2575   0   0   0 
Files :  6039   0  6039   0   2   0 
Bytes : 1.547 g   0 1.547 g   0   0   0 
Times : 0:00:53 0:00:00      0:00:00 0:00:53 

Ended : Tue Aug 30 04:32:48 2016 

如果两个文件失败,那么脚本应发送邮件到某个电子邮件地址。

+0

你问的是如何在'cmd'字符串中插入'k'和'​​v'的值吗? – FamousJameous

+0

“Robocopy {} {}/E ...”。格式(k,v) –

+0

是Jameous,我想在robocopy命令中插入k和v的值 – Ajsh

在Python的方式做这将是:

cmd = 'robocopy {} {} /E /MIR /W:2 /R:1'.format(k, v) 

,或者在Python 3.6:

cmd = f'robocopy {k} {v} /E /MIR /W:2 /R:1' 

然而,这是错误的!如果kv有空格,它可能会失败,它可能是security hazard(想象如果k = '; rm -rf /;)。产生子进程的正确方法是这样的:

cmd = ['robocopy', k, v, '/E', '/MIR', '/W:2', '/R:1'] 
+0

这不起作用cmd = ['robocopy',k,v,'/ E','/ MIR','/ W:2','/ R:1'] – Ajsh

+0

但这是工作cmd ='robocopy {} {}/E/MIR/W:2 /R:1'.format(k,v) – Ajsh

+0

@ user1602531它是如何工作的?错误信息是什么? – refi64