import threading
import os
def file_converter(file):
os.system("file_converter.py {0} > {1}".format(file, file.replace(".evtx", ".xml")))
base_dir = "C:\\Users\\carlo.zanocco\\Desktop\\test_dir\\"
for file in os.listdir(base_dir):
threading.Thread(target=file_converter, args=(file,)).start()
Вот мой пример кода. Вы можете создать несколько потоков для запуска операции «одновременно». Программа проверит все файлы в каталоге и преобразует его.
РЕДАКТИРОВАТЬ python2 .7 версия
Теперь, когда у нас есть больше информации о том, что вы хотите, я могу вам помочь. Эта программа может обрабатывать несколько файлов одновременно из одной папки, она также проверяет вложенные папки.
import subprocess
import os
base_dir = "C:\\Users\\carlo.zanocco\\Desktop\\test_dir\\"
commands_to_run = list()
#Search all files
def file_list(directory):
allFiles = list()
for entry in os.listdir(directory):
fullPath = os.path.join(directory, entry)
#if is directory search for more files
if os.path.isdir(fullPath):
allFiles = allFiles + file_list(fullPath)
else:
#check that the file have the right extension and append the command to execute later
if(entry.endswith(".evtx")):
commands_to_run.append("C:\\Python27\\python.exe file_converter.py {0} > {1}".format(fullPath, fullPath.replace(".evtx", ".xml")))
return allFiles
print "Searching for files"
file_list(base_dir)
print "Running conversion"
processes = [subprocess.Popen(command, shell=True) for command in commands_to_run]
print "Waiting for converted files"
for process in processes:
process.wait()
print "Conversion done"
Модуль подпроцесса можно использовать двумя способами:
- subprocess.Popen: он запускает процесс и продолжает выполнение
- subprocess.call: он запускает процесс и ждет его, эта функция возвращает статус выхода. Это значение, если ноль, указывает, что процесс завершается успешно
РЕДАКТИРОВАТЬ python3 .7 версия
, если вы хотите решить все свои проблемы, просто внедрите код, которым вы делитесь с github в ваша программа. Вы можете легко реализовать его как функцию.
import threading
import os
import Evtx.Evtx as evtx
import Evtx.Views as e_views
base_dir = "C:\\Users\\carlo.zanocco\\Desktop\\test_dir\\"
def convert(file_in, file_out):
tmp_list = list()
with evtx.Evtx(file_in) as log:
tmp_list.append(e_views.XML_HEADER)
tmp_list.append("<Events>")
for record in log.records():
try:
tmp_list.append(record.xml())
except Exception as e:
print(e)
tmp_list.append("</Events>")
with open(file_out, 'w') as final:
final.writelines(tmp_list)
#Search all files
def file_list(directory):
allFiles = list()
for entry in os.listdir(directory):
fullPath = os.path.join(directory, entry)
#if is directory search for more files
if os.path.isdir(fullPath):
allFiles = allFiles + file_list(fullPath)
else:
#check that the file have the right extension and append the command to execute later
if(entry.endswith(".evtx")):
threading.Thread(target=convert, args=(fullPath, fullPath.replace(".evtx", ".xml"))).start()
return allFiles
print("Searching and converting files")
file_list(base_dir)
Если вы хотите, чтобы ваши файлы генерировались, просто отредактируйте, как указано выше:
def convert(file_in, file_out):
tmp_list = list()
with evtx.Evtx(file_in) as log:
with open(file_out, 'a') as final:
final.write(e_views.XML_HEADER)
final.write("<Events>")
for record in log.records():
try:
final.write(record.xml())
except Exception as e:
print(e)
final.write("</Events>")
ОБНОВЛЕНИЕ
Если вы хотите чтобы удалить файлы '.evtx' после преобразования, вы можете просто добавить следующие строки в конце функции convert
:
try:
os.remove(file_in)
except(Exception, ex):
raise ex
Здесь вам просто нужно использовать try .. except
, потому что вы запускаете поток, только если входное значение является файлом. Если файл не существует, эта функция выдает исключение, поэтому сначала необходимо проверить os.path.isfile()
.