设置“图像文件执行选项”将始终打开命名的exe文件作为默认值

时间:2010-06-06 16:02:50

标签: registry

作为this link suggests,我想通过运行命令

使用“图像文件执行选项”功能将Notepad.exe替换为Notepad2.exe
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

但是当我运行记事本时,它仍会打开文件

  

C:\ WINDOWS \ Notepad.exe的

默认情况下,在notepad2.exe中将

作为文本文件。

有没有办法避免这种情况?

我知道使用这个技术Notepad.exe将作为传递给Notepad2.exe的第一个参数。但我不知道如何避免这种情况:(

5 个答案:

答案 0 :(得分:15)

"调试器的目的" key是自动启动调试器并将原始命令行传递给所需的调试器。它还在win32函数CreateProcess上设置一个标志,指示这是一个调试会话。

暗示调试器将在适当修改参数后调用CreateProcess。

>notepad.exe "\document1.txt"

变成

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

mydebugger可以调用这样的东西:

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

因此,滥用此注册表项的解决方案是 制作可以按照您希望的方式操作命令行的假调试器。 这应该是一个简单的过程,只需解析命令行并用notepad2.exe替换notepad.exe。然后,您需要将注册表指向该.exe

答案 1 :(得分:4)

对于Notepad ++,为了解决“notepad.exe”作为文档引入的问题,创建一个简单的启动器批处理文件(请参阅@ Ben的答案为什么),然后将图像调试器指向该处(la @ fenster的答案) )。

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

添加到注册表:

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

答案 2 :(得分:3)

Notepad Replacer使用了这种技术,但它非常易于使用,并且可以使用不支持调试器的编辑器。

答案 3 :(得分:1)

来自Here 用Notepad2 4.1.24(或更新版本)替换Windows记事本

从版本4.1.24开始,Notepad2的官方发行版支持此方法替换Windows记事本,因此上述步骤可以正常工作。但是,由于Notepad2的官方发行版不会修改系统注册表,因此不支持自动执行记事本替换。出于同样的原因,默认情况下不支持通过Windows 7跳转列表访问最近的文件(这需要首先在系统注册表中注册应用程序)。

另请注意,如果将Notepad2用作便携式设备的记事本替代品,则自动记事本替换可能会产生不良影响,并且断开设备时原始状态未恢复。

从Notepad2目录运行并替换Windows记事本的批处理脚本可能如下所示(需要提升权限):

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

可以使用此命令恢复Windows记事本(需要提升权限):

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

通过打开Regedit并查看[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]来验证结果。 Debugger键应包含notepad2.exe的完整路径,并包含尾随/z,例如:

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

答案 4 :(得分:0)

我使用以下批处理文件打开emacs而不是记事本。我还包括一个绕过它的参数,这样我仍然可以在需要时使用记事本。例如从提升的命令提示符编辑hosts文件:

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

将它放在路径上的某处并编辑最后一行以打开文本编辑器:

@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!"

使用此命令将其设置为替换记事本:

 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"

或者只是像这样调用脚本:

SCRIPT JUNK --NOTEPAD

应调用记事本,但之后用此脚本替换