Need command to restart Notepad ++



  • In the file shortcuts.xml I wrote this code:

    		<Command name="Restart" Ctrl="no" Alt="no" Shift="no" Key="0">Restart.bat</Command>
    

    It runs the Restart.bat file with this code:

    taskkill /f /im notepad++.exe
    start notepad++.exe
    

    Is there a simpler solution to restart Notepad ++ from the menu “Run”?



  • @andrecool-68

    IMHO your code is even too simple. The TASKKILL command doesn’t really kill a process, instead it sends a signal to a process requesting to terminate itself. This way an application can show a confirmation dialog when it has unsaved data/documents. Notepad++ behaves exactly like that. Thus the start notepad++ command may fail to start a new instance of Npp if it is set to single-instance-mode.

    That’s the code I use for the same purpose (VB Script). It expects as the first command line argument the path to the Npp directory.

    Option Explicit
    
    
    '-------------------------------------------------------------------------------
    'Variables declaration
    '-------------------------------------------------------------------------------
    Dim objFSO, objWshShell, objWMIService
    Dim colProcesses, objProcess, strInstanceQuery
    Dim colEvents, objEvent, strEventQuery, intInterval
    Dim strNppDirPath, strNppExeName, strNppExePath
    
    
    '-------------------------------------------------------------------------------
    'Variables initialization
    '-------------------------------------------------------------------------------
    Set objFSO        = CreateObject("Scripting.FileSystemObject")
    Set objWshShell   = CreateObject("WScript.Shell")
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2" )
    
    strNppExeName     = "notepad++.exe"
    intInterval       = 1
    
    
    '-------------------------------------------------------------------------------
    ' Request termination of running Npp, wait for its termination and restart it
    '-------------------------------------------------------------------------------
    If WScript.Arguments.Count > 0 Then
      strNppDirPath = WScript.Arguments(0)
      strNppExePath = objFSO.BuildPath(strNppDirPath, strNppExeName)
    
      If objFSO.FileExists(strNppExePath) Then
        strInstanceQuery = "SELECT * FROM Win32_Process" & _
                           " WHERE ExecutablePath = '" & EscapeForWMI(strNppExePath) & "'"
    
        strEventQuery    = "SELECT * FROM __InstanceOperationEvent" & _
                           " WITHIN " & intInterval & _
                           " WHERE TargetInstance ISA 'Win32_Process'" & _
                           " AND TargetInstance.ExecutablePath = '" & EscapeForWMI(strNppExePath) & "'"
    
        Set colProcesses = objWMIService.ExecQuery(strInstanceQuery)
    
        For Each objProcess In colProcesses
          objWshShell.Run "taskkill /im " & Quote(strNppExeName), 0, False
    
          Set colEvents = objWMIService.ExecNotificationQuery(strEventQuery)
    
          Do
            Set objEvent = colEvents.NextEvent()
    
            Select Case objEvent.Path_.Class
              Case "__InstanceDeletionEvent" Exit Do
            End Select
          Loop
    
          objWshShell.Run Quote(strNppExePath), 1, False
    
          Exit For
        Next
      End If
    End If
    
    
    
    
    '===============================================================================
    ' Surround a string with double quotes
    '===============================================================================
    
    Function Quote(ByRef strString)
      Quote = """" & strString & """"
    End Function
    
    
    '===============================================================================
    ' Escape special chars of string for using it with WMI
    '===============================================================================
    
    Function EscapeForWMI(ByRef strAString)
      EscapeForWMI = Replace(strAString, "\", "\\")
    End Function
    

    This is the required entry for shortcuts.xml:

    <Command name="Restart" Ctrl="no" Alt="no" Shift="no" Key="0">wscript.exe /nologo "<Path-To-Restart-Script>" "$(NPP_DIRECTORY)"</Command>
    


  • @dinkumoil

    The TASKKILL command doesn’t really kill a process, instead it sends a signal to a process requesting to terminate itself.

    not quite. with the /f switch in taskkill /f /im notepad++.exe, the process will be terminated non graceful and immediately.
    but your script is cool.

    @andrecool-68

    you can put it directly into shortcut.xml, without an extra batch file:

    <Command name="Restart" Ctrl="no" Alt="no" Shift="no" Key="0">cmd /c taskkill /f /im notepad++.exe && "FULL_PATH_TO_YOUR\notepad++.exe"</Command>
    


  • @Meta-Chuh said:

    with the /f switch in taskkill /f /im notepad++.exe, the process will be terminated non graceful and immediately.

    You are right. I assumed that nobody wants to loose his unsaved documents, but there may be cases.



  • @Meta-Chuh
    And how is such a combination of two code variants … does it violate the laws of criminal law?

    <Command name="Restart" Ctrl="no" Alt="no" Shift="no" Key="0">cmd /c taskkill /f /im notepad++.exe && start notepad++.exe</Command>


  • @andrecool-68

    You have to escape the & characters to be compliant with the XML syntax:

    <Command name="Restart" Ctrl="no" Alt="no" Shift="no" Key="0">cmd /c taskkill /f /im notepad++.exe &amp;&amp; start notepad++.exe</Command>
    

    But why do you want to do that? It is not necessary to explicitly launch cmd.exe since taskkill is a console command, hence cmd.exe is started automatically. Or, to be exact, taskkill is started and attached to a new console.

    EDIT: Forget what I wrote above, you want to start Npp after terminating the running instance, thus you need to call cmd.exe.



  • @dinkumoil I just want to get the most minimal code.



  • @andrecool-68

    Ah, now I understand your point, you erased the FULL_PATH_TO_YOUR\ part of @Meta-Chuh 's code.

    Well, I would say you are lucky that it works without the full path to Npp. I guess currently Npp sets its own path as the current path when it executes the command. But I would not rely on that, maybe this behaviour changes in the future.

    Over the years I got used to ALWAYS use fully qualified and quoted paths. This makes your scripts error proof and thus your life much more easy.



  • @dinkumoil I always use the portable version of Notepad ++, and try not to write full paths.



  • @andrecool-68

    You can use the Npp environment variable $(NPP_DIRECTORY).



  • @dinkumoil said:

    @andrecool-68

    You can use the Npp environment variable $(NPP_DIRECTORY).

    This is the most suitable way.



  • try

    @echo off

    taskkill /f /im notepad++.exe
    “C:\Program Files\Notepad++\notepad++.exe”

    cls



  • @gurikbal-singh said:

    try

    @echo off

    taskkill /f /im notepad++.exe
    “C:\Program Files\Notepad++\notepad++.exe”

    cls

    I tried to get rid of it … and you offer me to return to this?



  • @andrecool-68

    I tried to get rid of it … and you offer me to return to this?

    the translator of @gurikbal-singh is on holiday 😁



  • @andrecool-68

    by the way:

    And how is such a combination of two code variants … does it violate the laws of criminal law?
    <Command name="Restart" Ctrl="no" Alt="no" Shift="no" Key="0">cmd /c taskkill /f /im notepad++.exe && start notepad++.exe</Command>

    lol, no, everything is legal 😉

    your version is correct, mine was wrong, as it keeps the cmd window open.
    i just have forgotten the start command while typing, sorry 🙏



  • Just for completeness, there is also the $(NPP_FULL_FILE_PATH) variable.



  • @Ekopalypse said:

    Just for completeness, there is also the $(NPP_FULL_FILE_PATH) variable.

    Please show me an example of your solution code.



  • @andrecool-68

    I don’t have one, it was in response to your response about using $(NPP_DIRECTORY),
    which would mean you need to concatenate directory and executable wheres $(NPP_FULL_FILE_PATH) is already the complete path.
    Did I misunderstood something?



  • @Ekopalypse I understood))


Log in to reply