Community
    • Login

    Script to auto-update portable Notepad++ version

    Scheduled Pinned Locked Moved General Discussion
    15 Posts 6 Posters 6.0k Views 6 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Alan KilbornA Offline
      Alan Kilborn @Laur Florin
      last edited by

      @Laur-Florin said:

      or feedback you may have

      I think this is positive feedback: While I won’t use your script in its entirety, I think I’ll adapt parts of it to automate grabbing a new version of N++ portable; mainly to save the drudge work of click…click…click…

      1 Reply Last reply Reply Quote 1
      • xomxX Offline
        xomx @PeterJones
        last edited by

        @PeterJones said in Script to auto-update portable Notepad++ version:

        a “destructive” upgrade

        There already is the @mpheath handy PythonScript sln, IIRC it does not overwrite that xmls:
        https://community.notepad-plus-plus.org/post/95098

        patrickdrdP 1 Reply Last reply Reply Quote 2
        • patrickdrdP Offline
          patrickdrd @xomx
          last edited by

          @xomx good, thanks, but isn’t a batch file more convenient? can the OP include the code in his own script?

          Laur FlorinL 1 Reply Last reply Reply Quote 0
          • Laur FlorinL Offline
            Laur Florin @patrickdrd
            last edited by Laur Florin

            @patrickdrd I tried to come with an updated version that can (hopefully) backup the configs before in a temporary folder, perform the upgrade, then restore back the config files.

            As always , I recommend caution and extensive testing first in a virtual environment, if someone ever want to use it.

            @echo off
            setlocal enabledelayedexpansion
            
            :: Define variables
            set "json_url=https://api.github.com/repos/notepad-plus-plus/notepad-plus-plus/releases/latest"
            set "download_path=%~dp0npp_latest.zip"
            set "extract_temp=%~dp0npp_temp"
            set "install_path=%~dp0"
            set "exe_path=%install_path%notepad++.exe"
            set "backup_path=%install_path%config_backup"
            set "installed_version="
            set "latest_version="
            
            :: Get installed Notepad++ version
            for /f "tokens=*" %%i in ('powershell -Command "(Get-Item '%exe_path%').VersionInfo.ProductVersion"') do (
                set "installed_version=%%i"
            )
            
            :: Get latest release version from GitHub
            for /f "tokens=*" %%i in ('powershell -Command "$json = Invoke-WebRequest -Uri '%json_url%' -UseBasicParsing | ConvertFrom-Json; $json.tag_name -replace 'v',''"') do (
                set "latest_version=%%i"
            )
            
            :: Check if both versions were retrieved
            if "%installed_version%"=="" (
                echo Error: Could not determine installed Notepad++ version.
                pause
                exit /b
            )
            
            if "%latest_version%"=="" (
                echo Error: Could not retrieve latest Notepad++ version from GitHub.
                pause
                exit /b
            )
            
            :: Display versions
            echo Installed Version  : %installed_version%
            echo Latest Version     : %latest_version%
            
            :: Compare versions
            if "%installed_version%"=="%latest_version%" (
                echo Notepad++ is up to date. No update needed.
                pause
                exit /b
            )
            
            echo A new version is available! Updating...
            
            :: Get latest release download URL
            for /f "tokens=*" %%i in ('powershell -Command "$json = Invoke-WebRequest -Uri '%json_url%' -UseBasicParsing | ConvertFrom-Json; $json.assets | Where-Object { $_.name -like 'npp.*.portable.x64.zip' } | Select-Object -ExpandProperty browser_download_url"') do (
                set "download_url=%%i"
            )
            
            if "%download_url%"=="" (
                echo Failed to retrieve the latest Notepad++ Portable download URL.
                pause
                exit /b
            )
            
            :: Backup important config files
            echo Backing up user configurations...
            mkdir "%backup_path%" 2>nul
            for %%f in (config.xml stylers.xml langs.xml shortcuts.xml contextMenu.xml userDefineLang.xml) do (
                if exist "%install_path%\%%f" copy /Y "%install_path%\%%f" "%backup_path%"
            )
            
            :: Download the latest version
            echo Downloading latest Notepad++ Portable...
            powershell -Command "(New-Object System.Net.WebClient).DownloadFile('%download_url%', '%download_path%')"
            
            :: Extract to a temporary folder
            echo Extracting update...
            rmdir /s /q "%extract_temp%" 2>nul
            mkdir "%extract_temp%"
            powershell -Command "Expand-Archive -Force '%download_path%' '%extract_temp%'"
            
            :: Move extracted files to install directory FIRST
            echo Updating Notepad++...
            xcopy /E /Y "%extract_temp%\*" "%install_path%\" >nul
            
            :: Restore user configurations AFTER updating
            echo Restoring user configurations...
            for %%f in (config.xml stylers.xml langs.xml shortcuts.xml contextMenu.xml userDefineLang.xml) do (
                if exist "%backup_path%\%%f" copy /Y "%backup_path%\%%f" "%install_path%\%%f"
            )
            
            :: Cleanup
            echo Cleaning up...
            del "%download_path%"
            rmdir /s /q "%extract_temp%"
            rmdir /s /q "%backup_path%"
            
            echo Update completed! Notepad++ is now updated to version %latest_version%.
            pause
            
            

            Mainly added the lines to preserve the configs, maybe this will be better a bit. If i missed any files to backup and restore from config, as I don’t know them all exactly, I can try to update this further by excluding the necessary files from updating or overwriting

            patrickdrdP 1 Reply Last reply Reply Quote 0
            • patrickdrdP Offline
              patrickdrd @Laur Florin
              last edited by

              @Laur-Florin hmm, I would prefer to skip them like the other script, actually I think they’re only two: config xml and shortcuts.xml,
              also an option to skip localisation files (and do copy only English ones) would be great,
              thanks!

              Laur FlorinL deleeleeD 2 Replies Last reply Reply Quote 0
              • Laur FlorinL Offline
                Laur Florin @patrickdrd
                last edited by

                @patrickdrd sure! I’ll keep tinkering with it, and if I manage to accomplish this, I’ll post an update

                Laur FlorinL 1 Reply Last reply Reply Quote 1
                • Laur FlorinL Offline
                  Laur Florin @Laur Florin
                  last edited by Laur Florin

                  Hi there. I tried to make some further changes to it. Hopefully it will work alright . However it still needs further work for sure.

                  @echo off
                  setlocal enabledelayedexpansion
                  
                  :: Define variables
                  set "json_url=https://api.github.com/repos/notepad-plus-plus/notepad-plus-plus/releases/latest"
                  set "download_path=%~dp0npp_latest.zip"
                  set "extract_temp=%~dp0npp_temp"
                  set "install_path=%~dp0"
                  set "exe_path=%install_path%notepad++.exe"
                  set "backup_path=%install_path%config_backup"
                  set "installed_version="
                  set "latest_version="
                  
                  :: Get installed Notepad++ version
                  for /f "tokens=*" %%i in ('powershell -Command "(Get-Item '%exe_path%').VersionInfo.ProductVersion"') do (
                      set "installed_version=%%i"
                  )
                  
                  :: Get latest release version from GitHub
                  for /f "tokens=*" %%i in ('powershell -Command "$json = Invoke-WebRequest -Uri '%json_url%' -UseBasicParsing | ConvertFrom-Json; $json.tag_name -replace 'v',''"') do (
                      set "latest_version=%%i"
                  )
                  
                  :: Check if both versions were retrieved
                  if "%installed_version%"=="" (
                      echo Error: Could not determine installed Notepad++ version.
                      pause
                      exit /b
                  )
                  
                  if "%latest_version%"=="" (
                      echo Error: Could not retrieve latest Notepad++ version from GitHub.
                      pause
                      exit /b
                  )
                  
                  :: Display versions
                  echo Installed Version  : %installed_version%
                  echo Latest Version     : %latest_version%
                  
                  :: Compare versions
                  if "%installed_version%"=="%latest_version%" (
                      echo Notepad++ is up to date. No update needed.
                      pause
                      exit /b
                  )
                  
                  echo A new version is available! Updating...
                  
                  :: Get latest release download URL
                  for /f "tokens=*" %%i in ('powershell -Command "$json = Invoke-WebRequest -Uri '%json_url%' -UseBasicParsing | ConvertFrom-Json; $json.assets | Where-Object { $_.name -like 'npp.*.portable.x64.zip' } | Select-Object -ExpandProperty browser_download_url"') do (
                      set "download_url=%%i"
                  )
                  
                  if "%download_url%"=="" (
                      echo Failed to retrieve the latest Notepad++ Portable download URL.
                      pause
                      exit /b
                  )
                  
                  :: Backup important config files (except config.xml and shortcuts.xml)
                  echo Backing up user configurations...
                  mkdir "%backup_path%" 2>nul
                  for %%f in (stylers.xml langs.xml contextMenu.xml userDefineLang.xml) do (
                      if exist "%install_path%\%%f" copy /Y "%install_path%\%%f" "%backup_path%"
                  )
                  
                  :: Download the latest version
                  echo Downloading latest Notepad++ Portable...
                  powershell -Command "(New-Object System.Net.WebClient).DownloadFile('%download_url%', '%download_path%')"
                  
                  :: Extract to a temporary folder
                  echo Extracting update...
                  rmdir /s /q "%extract_temp%" 2>nul
                  mkdir "%extract_temp%"
                  powershell -Command "Expand-Archive -Force '%download_path%' '%extract_temp%'"
                  
                  :: Move extracted files to install directory while EXCLUDING config.xml and shortcuts.xml
                  echo Updating Notepad++...
                  robocopy "%extract_temp%" "%install_path%" /E /NFL /NDL /NJH /NJS /R:3 /W:2 /XF config.xml shortcuts.xml >nul
                  
                  :: Restore user configurations (EXCEPT config.xml and shortcuts.xml)
                  echo Restoring user configurations...
                  for %%f in (stylers.xml langs.xml contextMenu.xml userDefineLang.xml) do (
                      if exist "%backup_path%\%%f" copy /Y "%backup_path%\%%f" "%install_path%\%%f"
                  )
                  
                  :: Remove all localization files except English
                  echo Removing unnecessary localization files...
                  for %%f in ("%install_path%\localization\*") do (
                      if NOT "%%~nxf"=="english.xml" if NOT "%%~nxf"=="nativeLang.xml" del "%%f"
                  )
                  
                  :: Cleanup
                  echo Cleaning up...
                  del "%download_path%"
                  rmdir /s /q "%extract_temp%"
                  rmdir /s /q "%backup_path%"
                  
                  echo Update completed! Notepad++ is now updated to version %latest_version%.
                  pause
                  
                  

                  Hopefully this later iteration can sort all the issues so far. Tried to include an approach to skip the important settings, hotkeys, localizations as well. // edit: after some tests it still has unexpected errors, do not use. Work will still be in progress , hopefully i will find a breakthrough with enough testing in my spare time

                  patrickdrdP Alan KilbornA 2 Replies Last reply Reply Quote 1
                  • patrickdrdP Offline
                    patrickdrd @Laur Florin
                    last edited by

                    @Laur-Florin said in Script to auto-update portable Notepad++ version:

                    robocopy “%extract_temp%” “%install_path%” /E /NFL /NDL /NJH /NJS /R:3 /W:2 /XF config.xml shortcuts.xml >nul

                    I like this exclusion command, I think there’s no need for backup folder,
                    also you could copy from extract_temp/localization only english.xml and skip the rest, so it should be somehow simpler

                    patrickdrdP 1 Reply Last reply Reply Quote 0
                    • patrickdrdP Offline
                      patrickdrd @patrickdrd
                      last edited by patrickdrd

                      here’s my version, I tested and it works,
                      I’m excluding themes too and I changed working folder(s) to d:\downloads

                      @echo off
                      setlocal enabledelayedexpansion
                      
                      :: Define variables
                      set "json_url=https://api.github.com/repos/notepad-plus-plus/notepad-plus-plus/releases/latest "
                      set "download_path=d:\downloads\npp_latest.zip"
                      set "extract_temp=d:\downloads\npp"
                      set "install_path=.\"
                      set "exe_path=%install_path%notepad++.exe"
                      
                      REM set "download_path=%~dp0npp_latest.zip"
                      REM set "extract_temp=%~dp0npp_temp"
                      REM set "install_path=%~dp0"
                      REM set "exe_path=%install_path%notepad++.exe"
                      REM set "backup_path=%install_path%config_backup"
                      set "installed_version="
                      set "latest_version="
                      
                      :: Get installed Notepad++ version
                      for /f "tokens=*" %%i in ('powershell -Command "(Get-Item '%exe_path%').VersionInfo.ProductVersion"') do (
                          set "installed_version=%%i"
                      )
                      
                      :: Get latest release version from GitHub
                      for /f "tokens=*" %%i in ('powershell -Command "$json = Invoke-WebRequest -Uri '%json_url%' -UseBasicParsing | ConvertFrom-Json; $json.tag_name -replace 'v',''"') do (
                          set "latest_version=%%i"
                      )
                      
                      :: Check if both versions were retrieved
                      if "%installed_version%"=="" (
                          echo Error: Could not determine installed Notepad++ version.
                          pause
                          exit /b
                      )
                      
                      if "%latest_version%"=="" (
                          echo Error: Could not retrieve latest Notepad++ version from GitHub.
                          pause
                          exit /b
                      )
                      
                      :: Display versions
                      echo Installed Version  : %installed_version%
                      echo Latest Version     : %latest_version%
                      
                      :: Compare versions
                      if "%installed_version%"=="%latest_version%" (
                          echo Notepad++ is up to date. No update needed.
                          pause
                          exit /b
                      )
                      
                      echo A new version is available! Updating...
                      
                      :: Get latest release download URL
                      for /f "tokens=*" %%i in ('powershell -Command "$json = Invoke-WebRequest -Uri '%json_url%' -UseBasicParsing | ConvertFrom-Json; $json.assets | Where-Object { $_.name -like 'npp.*.portable.x64.zip' } | Select-Object -ExpandProperty browser_download_url"') do (
                          set "download_url=%%i"
                      )
                      
                      if "%download_url%"=="" (
                          echo Failed to retrieve the latest Notepad++ Portable download URL.
                          pause
                          exit /b
                      )
                      
                      REM :: Backup important config files (except config.xml and shortcuts.xml)
                      REM echo Backing up user configurations...
                      REM mkdir "%backup_path%" 2>nul
                      REM for %%f in (stylers.xml langs.xml contextMenu.xml userDefineLang.xml) do (
                          REM if exist "%install_path%\%%f" copy /Y "%install_path%\%%f" "%backup_path%"
                      REM )
                      
                      :: Download the latest version
                      echo Downloading latest Notepad++ Portable...
                      powershell -Command "(New-Object System.Net.WebClient).DownloadFile('%download_url%', '%download_path%')"
                      
                      :: Extract to a temporary folder
                      echo Extracting update...
                      rmdir /s /q "%extract_temp%" 2>nul
                      mkdir "%extract_temp%"
                      powershell -Command "Expand-Archive -Force '%download_path%' '%extract_temp%'"
                      
                      :: Move extracted files to install directory while EXCLUDING config.xml and shortcuts.xml
                      echo Updating Notepad++...
                      robocopy "%extract_temp%" . /e /copy:DAT /dcopy:T /r:0 /xf config.xml shortcuts.xml /XD localization themes /IS /IT
                      REM xcopy . "D:\downloads\npp2" /c /q /h /r /k /y /e /exclude:"D:\Utilities\PortableApps\Notepad++\xcopy_excludes.txt"
                      REM robocopy "%extract_temp%" "%install_path%" /E /NFL /NDL /NJH /NJS /R:3 /W:2 /XF config.xml shortcuts.xml /XD localization themes >nul
                      REM pause
                      
                      REM :: Restore user configurations (EXCEPT config.xml and shortcuts.xml)
                      REM echo Restoring user configurations...
                      REM for %%f in (stylers.xml langs.xml contextMenu.xml userDefineLang.xml) do (
                          REM if exist "%backup_path%\%%f" copy /Y "%backup_path%\%%f" "%install_path%\%%f"
                      REM )
                      
                      REM :: Remove all localization files except English
                      REM echo Removing unnecessary localization files...
                      REM for %%f in ("%install_path%\localization\*") do (
                          REM if NOT "%%~nxf"=="english.xml" if NOT "%%~nxf"=="nativeLang.xml" del "%%f"
                      REM )
                      
                      
                      copy /y "%extract_temp%\localization\english*.xml" ".\localization"
                      REM pause
                      
                      :: Cleanup
                      echo Cleaning up...
                      del "%download_path%"
                      rmdir /s /q "%extract_temp%"
                      REM rmdir /s /q "%backup_path%"
                      REM pause
                      
                      
                      echo Update completed! Notepad++ is now updated to version %latest_version%.
                      pause
                      
                      
                      
                      1 Reply Last reply Reply Quote 1
                      • Alan KilbornA Offline
                        Alan Kilborn @Laur Florin
                        last edited by

                        @Laur-Florin

                        Just curious… The batch file makes use of a lot of powershell. Why did you decide to make it a hybrid batch/powershell script instead of going 100% powershell?

                        1 Reply Last reply Reply Quote 0
                        • deleeleeD Offline
                          deleelee @patrickdrd
                          last edited by deleelee

                          actually I think they’re only two: config xml and shortcuts.xml,

                          If used, there is also toolbarIcons.xml and overrideMap.xml

                          1 Reply Last reply Reply Quote 0

                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                          With your input, this post could be even better 💗

                          Register Login
                          • First post
                            Last post
                          The Community of users of the Notepad++ text editor.
                          Powered by NodeBB | Contributors