python windows将for循环中的值解释为cmd命令

时间:2016-08-30 22:47:52

标签: python windows robocopy

这是一个代码

    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"的值和" v"在robocopy命令之后的cmd中,以便在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

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

1 个答案:

答案 0 :(得分:0)

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(想象一下{{1} }})。产生子进程的正确方法是:

k = '; rm -rf /;