import json, subprocess
def get_systeminfo():
# Command to run.
command = ['systeminfo']
# Run the commands and get the stdout.
with subprocess.Popen(command, universal_newlines=True, stdout=subprocess.PIPE) as p:
stdout, _ = p.communicate()
return stdout
def dic_from_systeminfo(stdout):
# Dic to store all info.
dic = {}
# Previous key name saved to reuse for dic values.
prevkey = ''
# Loop through each line of stdout and split by colon.
for line in stdout.splitlines():
key, sep, value = line.partition(':')
if sep == ':':
value = value.strip()
if not key.startswith(' '):
# Assign these keys with values of type dic.
if key in ('Original Install Date', 'System Boot Time'):
value = {k: v.strip() for k, v in zip(('Date', 'Time'), value.split(','))}
elif key in ('Processor(s)', 'Hotfix(s)', 'Network Card(s)'):
value = dict()
# Add to dic and save key name.
dic[key] = value
prevkey = key
else:
# Remove [] characters and then add key and value to the value type dic.
key = key.strip().replace('[', '').replace(']', '')
if prevkey and isinstance(dic[prevkey], dict):
dic[prevkey][key] = value
else:
print('Warning:', 'dic[' + prevkey + '] is not a dict value.')
return dic
# Run Systeminfo and get stdout.
stdout = get_systeminfo()
# Get dic from stdout (or read file content).
dic = dic_from_systeminfo(stdout)
# Write the dic to file.
if dic:
with open('systeminfo.json', 'w', encoding='utf-8') as w:
json.dump(dic, w, indent=4)
Сценарий выполняет команду systeminfo
и получает стандартный вывод.
Стандартный вывод обрабатывается построчно в цикле for
, а затем разделяется на ключ и значение с помощью str.partition
method.
Если имя ключа не начинается с пробела, то это корневой ключ.Если оно совпадает с одним из имен специальных ключей, ему будет присвоено значение типа словаря, иначе будет установлено текущее значение.Имя ключа сохраняется в prevkey
, так что если сработало условие else, prevkey
может использоваться в качестве корневого ключа, а ключ и значение будут установлены в этот корневой ключ.
Квадратные скобкиудаляются из ключей в состоянии else, хотя это можно считать необязательным предпочтением.
Если dic
является чем-то, то оно будет записано в systeminfo.json
.
Есливам нужны только определенные ключи, тогда вы можете сохранить интересующие вас ключи в отдельном словаре и записать их в файл.
В качестве основного кода для чтения из существующего файла используйте:
stdout = ''
# Read from existing file.
with open('sysinfo.txt') as r:
stdout = r.read()
# Get dic from stdout (or read file content).
dic = dic_from_systeminfo(stdout)
# Write the dic to file.
if dic:
with open('systeminfo.json', 'w', encoding='utf-8') as w:
json.dump(dic, w, indent=4)