# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
import os
from os.path import join, normpath, pathsep, dirname # NOQA
[docs]def get_regstr(regtype, var, val):
regtype_map = {
'REG_EXPAND_SZ': 'hex(2):',
'REG_DWORD': 'dword:',
'REG_BINARY': None,
'REG_MULTI_SZ': None,
'REG_SZ': '',
}
# It is not a good idea to write these variables...
EXCLUDE = ['USERPROFILE', 'USERNAME', 'SYSTEM32']
if var in EXCLUDE:
return ''
def quotes(str_):
return '"' + str_.replace('"', r'\"') + '"'
sanitized_var = quotes(var)
if regtype == 'REG_EXPAND_SZ':
# Weird encoding
# bin_ = binascii.hexlify(hex_)
# val_ = ','.join([''.join(hex2) for hex2 in hex2zip])
# import binascii # NOQA
x = val
ascii_ = x.encode('ascii')
hex_ = ascii_.encode('hex')
hex_ = x.encode('hex')
hex2zip = zip(hex_[0::2], hex_[1::2])
spacezip = [('0', '0')] * len(hex2zip)
hex3zip = zip(hex2zip, spacezip)
sanitized_val = ','.join(
[''.join(hex2) + ',' + ''.join(space) for hex2, space in hex3zip]
)
elif regtype == 'REG_DWORD':
sanitized_val = '%08d' % int(val)
else:
sanitized_val = quotes(val)
# Comment with the human-readable nonhex version of the string
comment = '; ' + var + '=' + val
regstr = sanitized_var + '=' + regtype_map[regtype] + sanitized_val
return comment + '\n' + regstr
[docs]def make_regfile_str(key, varval_list, rtype):
# Input: list of (var, val) tuples
# key to put varval list in
# rtype - type of registry variables
envtxt_list = ['Windows Registry Editor Version 5.00', '', key]
print('\n'.join(map(repr, varval_list)))
varval_list = filter(lambda x: isinstance(x, tuple), varval_list)
vartxt_list = [get_regstr(rtype, var, val) for (var, val) in varval_list]
envtxt_list.extend(vartxt_list)
regfile_str = '\n'.join(envtxt_list)
return regfile_str
[docs]def add_to_win32_PATH(script_fpath, *add_path_list):
r"""
Writes a registery script to update the PATH variable into the sync registry
CommandLine:
python -m utool.util_win32 --test-add_to_win32_PATH --newpath "C:\Program Files (x86)\Graphviz2.38\bin"
Example:
>>> # DISABLE_DOCTEST
>>> # SCRIPT
>>> from utool.util_win32 import * # NOQA
>>> script_fpath = join(ut.truepath('~'), 'Sync/win7/registry', 'UPDATE_PATH.reg')
>>> new_path = ut.get_argval('--newpath', str, default=None)
>>> result = add_to_win32_PATH(script_fpath, new_path)
>>> print(result)
"""
import utool as ut
write_dir = dirname(script_fpath)
key = '[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]'
rtype = 'REG_EXPAND_SZ'
# Read current PATH values
win_pathlist = list(os.environ['PATH'].split(os.path.pathsep))
new_path_list = ut.unique_ordered(win_pathlist + list(add_path_list))
# new_path_list = unique_ordered(win_pathlist, rob_pathlist)
print('\n'.join(new_path_list))
pathtxt = pathsep.join(new_path_list)
varval_list = [('Path', pathtxt)]
regfile_str = make_regfile_str(key, varval_list, rtype)
ut.view_directory(write_dir)
print(regfile_str)
ut.writeto(script_fpath, regfile_str, mode='wb')
print('Please have an admin run the script. You may need to restart')
if __name__ == '__main__':
"""
CommandLine:
python -m utool.util_win32
python -m utool.util_win32 --allexamples
python -m utool.util_win32 --allexamples --noface --nosrc
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()