2016-08-30 5 views
0

Вот кодпитон окна интерпретировать значения из цикла для 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» и «V» в ЦМДЕ после ROBOCOPY команды, так что с в течение цикла он будет выполнять Robocopy для все источника и назначения, указанный в словаре D = {}

я также хотел бы, что скрипт проверяет сбои в выходных Robocopy бревен в error.log файла

  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

Вы спрашиваете, как вставить значения '' k' и V' в 'cmd' строку? – FamousJameous

+0

«Robocopy {} {}/E ...". Format (k, v) –

+0

Да Jameous, я хочу вставить значения k и v в команду robocopy – Ajsh

ответ

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' 

Однако, это не так! Это не удастся, если k и v имеют пробелы, и это может быть 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