DEV Community

cuongld2
cuongld2

Posted on • Updated on

Automatically install and uninstall app by powershell in Windows wrapper in Python code

Dear folks, sometimes you might run into the task where you need to automatically install something in Windows.

Recently, I needed to do that task. So today I'm gonna share with you how to do that in powershell wrapper by Python.

I.What is powershell:

You might want to checkout in wiki

Powershell is a shell tool available in windows (since Windows 8)

It has more functionality compared to the good old command in DOS

II.Real world problem:

We would need to check if the app is installed yet, if it is installed and it is the latest version -> skip. If it is installed but the version is not latest --> uninstall then install.

If the app is not installed yet, --> proceed to install the latest version.

1.Get the current running version of the app:

The sample app we're working on would be "Cốc Cốc" browser.


def get_current_login_user():
    import subprocess
    import re
    p1 = subprocess.Popen(["powershell.exe", "whoami"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    who_am_i = p1.communicate()[0]
    user_name = re.split(r'\\r', (re.split(r'.\\\\', str(who_am_i))[1]))[0]
    return user_name


def get_coccoc_version_folder_name():
    import subprocess
    import re
    p = subprocess.Popen(["powershell.exe",
                          f"cd C:\\Users\\{current_user}\\AppData\\Local\\CocCoc\\Browser\\Application; ls"],
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    current_dir = str(p.communicate()[0])
    coccoc_version = re.findall(r'\b\d+\.+\b\d+\.\b\d+\.+\d*', current_dir)[0]
    return coccoc_version

Enter fullscreen mode Exit fullscreen mode

2.Get the latest version info stored in yaml file:

yaml_made_utils = YamlUtils()
configuration_info = None
configuration_path = '/resources/configurations.yaml'


def get_configurations_info():
    if configuration_info is None:
        return yaml_made_utils.read_data_from_file(os.getcwd() + configuration_path)
    else:
        return configuration_info


class CocCocConfigs:
    COCCOC_DEV_VERSION = get_configurations_info()['coccoc_dev_version']

    @staticmethod
    def update_coccoc_dev_version(coccoc_version):
        data = get_configurations_info()
        data['coccoc_dev_version'] = coccoc_version
        return yaml_made_utils.write_data_to_file(data, os.getcwd() + configuration_path)


Enter fullscreen mode Exit fullscreen mode

3.Uninstall the app


def uninstall_coccoc_silently():
    import subprocess
    p = subprocess.Popen(["powershell.exe",
                          f"cd C:\\Users\\{current_user}\\AppData\\Local\\CocCoc\\Browser\\Application"
                          f"\\{get_coccoc_version_folder_name()}"
                          f"\\Installer; .\\setup.exe --uninstall --force-uninstall"],
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    p.communicate()

Enter fullscreen mode Exit fullscreen mode

4.Install the app


def install_coccoc_silently():
    import subprocess
    p = subprocess.Popen(["powershell.exe",
                          f"cd C:\\coccoc-dev; .\\{coccoc_installer_name} /silent /install"],
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    p.communicate()

Enter fullscreen mode Exit fullscreen mode

5.Main function to run would be like :


def main():
    if check_if_coccoc_is_installed():
        coccoc_version = get_coccoc_version_folder_name()
        from configs.yaml_configs import CocCocConfigs
        if coccoc_version in CocCocConfigs.COCCOC_DEV_VERSION:
            pass
        else:
            uninstall_coccoc_silently()
            import time
            time.sleep(5)
            install_coccoc_silently()
    else:
        install_coccoc_silently()


if __name__ == "__main__":
    main()

Enter fullscreen mode Exit fullscreen mode

You can checkout the source code from here

Notes: If you feel this blog help you and want to show the appreciation, feel free to drop by :

This will help me to contributing more valued contents.

Happy coding!!!

Top comments (0)