2010-06-06 13 views
9

Come this link suggests, voglio sostituire Notepad.exe con Notepad2.exe utilizzando "Immagine Opzioni di esecuzione di file" funzione eseguire il comandoSet "Immagine File Execution Options" sempre aprire il file exe denominato come predefinito

reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" 
     /v "Debugger" /t REG_SZ /d "\"c:\windows\Notepad2.exe\" /z" /f 

Ma quando corro notepad si apre ancora il file

c: \ windows \ notepad.exe

in notepad2.exe come file di testo per impostazione predefinita.

C'è un modo per evitarlo?

So che usare questo Notepad.exe tecnico come il primo parametro passato a Notepad2.exe. ma non so come evitare questo :(

+1

Questo dovrebbe probabilmente essere in Serverfault – fenster

+2

O btter Superuser – beppe9000

+0

ServerFault? Per una domanda su quale blocco note usare? ServerFault è per le domande relative al server, e le domande del blocco note non sono certamente esclusive solo per i server. SuperUser sarebbe molto meglio. – ProfK

risposta

1

Da Here Sostituire il Blocco note di Windows con Notepad2 4.1.24 (o più recente)

A partire dalla versione 4.1.24, il rilascio ufficiale di Notepad2 supporta questo metodo per la sostituzione di Blocco note di Windows, quindi i passaggi sopra descritti funzioneranno correttamente, tuttavia non è possibile eseguire automaticamente la sostituzione del Blocco note, poiché la versione ufficiale di Notepad2 non modificherà il Registro di sistema. Per lo stesso motivo, non è possibile accedere agli ultimi i file attraverso gli elenchi di salto di Windows 7, per impostazione predefinita (ciò richiede la registrazione delle applicazioni nel registro di sistema, prima)

Inoltre, tenere presente che la sostituzione automatica del Blocco note potrebbe avere effetti indesiderati se Notepad2 è stato utilizzato come sostituzione del Blocco note da un dispositivo portatile e lo stato originale non è stato ripristinato quando si scollega il dispositivo.

uno script batch per eseguire dalla directory Notepad2 e sostituire Blocco Note di Windows potrebbe essere simile a questo (richiede privilegi elevati):

reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "\"%~dp0Notepad2.exe\" /z" /f

Il Blocco note di Windows può essere ripristinato con questo comando (richiede privilegi elevati) :

reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /f

verificare il risultato con l'apertura di Regedit e guardando [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]. La chiave Debugger dovrebbe contenere il percorso completo notepad2.exe e includere il trascinamento /z, ad esempio:

c:\local\bin\Notepad2.exe /z 
+0

Grazie per la risposta. ma quando eseguo il comando reg add, non riesco a eseguire il blocco note, mi ha detto che non è stato trovato, se cambio% ~ dp0Notepad2.exe in Notepad2.exe (lo metto in c: \ windows \ system32), quando eseguo il blocco note , ha aperto Notepad2, ma il documento aperto predefinito è notepad.exe, non per documento vuoto. –

+1

Penso che il comando add in rosso sia un po 'complicato. Prova a creare la chiave manualmente o utilizzala nel reg aggiunto come test:/d "c: \ utils \ Notepad2.exe/z" – fenster

+0

Dopo aver eseguito il comando reg aggiungi il registro e verifica * HKLM \ ... \ Image Opzioni di esecuzione file \ notepad.exe * ha il percorso completo per notepad2.exe e presenta un trailing */z * o * -z *, ad esempio 'c: \ local \ bin \ Notepad2.exe -z'. Senza la Z aprirà un documento vuoto. –

12

Scopo del tasto "debugger" è quello di avviare automaticamente un debugger e passare la riga di comando originale al debugger desiderata . Imposta anche un flag sulla funzione win32 CreateProcess che indica che questa è una sessione di debug.

È implicito che il debugger chiamerà CreateProcess dopo aver modificato gli argomenti in modo appropriato.

>notepad.exe "\document1.txt" 

si trasforma in

>mydebugger.exe notepad.exe "\document1.txt" 

mydebugger potrebbe quindi chiamare qualcosa di simile:

BOOL res = CreateProcess(NULL, L"notepad.exe \"\\document1.txt\", NULL, NULL, 
          FALSE, cFlags, env, NULL, startupInfo, procInfo&); 

Quindi la soluzione per abusare di questa chiave di registro è quello di rendere il debugger falso che può manipolare la linea di comando nel modo desiderato. Dovrebbe essere un processo semplice che analizza solo la riga di comando e sostituisce notepad.exe con notepad2.exe. Quindi è necessario indirizzare il registro a quello .exe

+0

+1 per spiegare cosa succede dietro la scena –

2

Notepad Replacer utilizza questa tecnica, ma lo rende estremamente facile da usare e funziona con editor che non sono debugger-aware.

+2

odora di spam, vero?Ad ogni modo, la domanda è _how_ (non _quello strumento_) – kleopatra

+0

@kleopatra Non penso che sia uno spam. La risposta non fornisce una soluzione alla soluzione originale di OP? Inoltre, lo strumento collegato sembra essere libero. A proposito, la domanda in sé non è molto adatta per SO e dovrebbe essere migrata su un altro sito di SE. –

+0

Penso che la migliore risposta a "come" sia quella di utilizzare lo strumento che suggerisco, che è in realtà un'implementazione di ciò che la risposta più votata suggerisce (e lascia come esercizio per il lettore) "la soluzione per abusare di questa chiave di registro è quello di rendere il debugger falso in grado di manipolare la linea di comando nel modo desiderato. Dovrebbe essere un processo semplice che analizza solo la riga di comando e sostituisce notepad.exe con notepad2.exe. Quindi è necessario puntare il registro su quel file .exe' – user3484801

4

Per Notepad ++, per risolvere il problema "notepad.exe" viene introdotto come documento creare un semplice file batch di avvio (vedere @ Risposta di Ben per il motivo), quindi puntare il debugger dell'immagine in quel punto (a la @ fenster's risposta).

nppLauncher.bat:

if exist "C:\Program Files\Notepad++\notepad++.exe" start "" "C:\Program Files\Notepad++\notepad++.exe" %2 %3 %4 %5 %6 %7 %8 %9 
if exist "C:\Program Files (x86)\Notepad++\notepad++.exe" start "" "C:\Program Files (x86)\Notepad++\notepad++.exe" %2 %3 %4 %5 %6 %7 %8 %9 

Aggiungi al Registro di sistema:

reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "\"...\path\to\nppLauncher.bat"" /f 
0

Io uso il seguente file batch per aprire emacs invece di blocco note. Ho anche incluso un parametro per bypassarlo in modo che possa ancora usare il blocco note quando voglio. per esempio. modifica il file hosts da un prompt dei comandi con privilegi elevati:

notepad --NOTEPAD C:\Windows\System32\drivers\etc\hosts 

Mettere questo da qualche parte sul percorso e modificare l'ultima riga per aprire il vostro editor di testo:

@echo off 
setlocal enabledelayedexpansion 

::Sometimes you really want to use notepad (e.g. edit hosts file from an elevated command prompt) 
if "_%~2_" == "_--NOTEPAD_" (
    set "REALLY_NOTEPAD=TRUE" 
) 

:: For testing calling notepad again without removing debugger registry key 
:: making sure there's not an infinite loop! 
if "_%~2_" == "_STOPSTOPSTOP_" (
start "" echo FAILED TO START NOTEPAD 2 
exit /b 1 
) 

set "NOTEPAD=%~1" 
:: SHIFT command will not affect the value of %* which holds all the original arguments %1 %2 %3 
:: So need to remove notepad from "%*" all params variable 
:: Prepending --START-- in case %NOTEPAD% appears in params 
:: Quotes as NOTEPAD will /sometimes/ be in them in all params 
set "ALL=%*" 
set "ALLPARAMS=--START--%*" 
set "ALLPARAMS=!ALLPARAMS:--START--"%NOTEPAD%"=--START--!" 
set "ALLPARAMS=!ALLPARAMS:--START--%NOTEPAD%=--START--!" 
:: Also remove /multiple/ spaces between NOTEPAD and parameters 
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!" 
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!" 
set "ALLPARAMS=!ALLPARAMS:--START-- =!" 
:: Also remove --NOTEPAD if present 
set "ALLPARAMS=!ALLPARAMS:--START----NOTEPAD=--START--!" 
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!" 
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!" 
set "ALLPARAMS=!ALLPARAMS:--START-- =!" 
:: and --START--, just in case 
set "ALLPARAMS=!ALLPARAMS:--START--=!" 
IF "_%ALLPARAMS%_" == "__" (
:: Open a scratch buffer in emacs if no params 
    set "ALLPARAMS=**SCRATCH**" 
) 

:: Unicode support (I hope) 
chcp 65001 

::TEST not removing debugger registry key 
::if "_%REALLY_NOTEPAD%_" == "_TRUE_" start "" notepad STOPSTOPSTOP && exit /b 

if "_%REALLY_NOTEPAD%_" == "_TRUE_" (
    reg DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /F 
    start "" notepad !ALLPARAMS! 
    reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "%~0" 
    exit /b 0 
) 

C:\path\to\emacs\bin\emacsclientw.exe -na C:\path\to\emacs\bin\runemacs.exe "!ALLPARAMS!" 

set di sostituire notepad utilizzare questo comando:

reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "c:\path\to\wherever\you\savced\script-above.cmd" 

o semplicemente chiamare lo script come questo:

SCRIPT JUNK --NOTEPAD 

che dovrebbe richiamare blocco note, ma sostituirlo con questo script in seguito