找到notepad.exe和mspaint.exe的路径

Posted

技术标签:

【中文标题】找到notepad.exe和mspaint.exe的路径【英文标题】:Find the path of notepad.exe and mspaint.exe 【发布时间】:2010-10-05 21:16:39 【问题描述】:

找出notepad.exe 和mspaint.exe 所在位置的最佳方法是什么?它们可以在不同版本的Windows 中运行?

是否应该通过SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir)获取Windows目录,然后遍历所有子目录查找这两个文件?

(假设我对 Windows 文件夹之外的任何内容都不感兴趣。)

【问题讨论】:

无论您决定采用何种解决方案,都要做好完全找到它们的准备。我在某些系统上删除了其中一个或两个(当我有notepad++时为什么要保留notepad.exe) @Stephen:删除这些不会真正释放任何资源但只会引入破坏某些程序的风险的轻量级小东西有什么意义? 【参考方案1】:

这适用于我可以访问的每个 Windows 机器 (XP+)。

c:\> for %i in (cmd.exe) do @echo %~$PATH:i
C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo %~$PATH:i
C:\Python25\python.exe

很棒的是,您必须使用实际的%PATH%,您可以使用不同的环境变量替换您自己的搜索路径。

【讨论】:

它不会在许多本地化版本的 Windows 上,因为可执行文件的名称可能不同。 然后替换本地化名称。除非您认为 Win32 API 中的某处存在 WIN_NOTEPAD_REALNAME 常量,否则这对于任何解决方案都是一个问题。 notepad.exe 仍然是 notepad.exe 并且 cmd.exe 在我见过的所有 Windows 语言版本(98、XP、Vista)中仍然是 cmd.exe(大约 20 个)。文件夹的名称可能不同,但可执行文件、库和其他重要内容不会被翻译——至少文件名不会。 当文件名位于多个路径中时,我认为这不起作用,因为它似乎没有显示所有路径.. 例如,我在 windows 中的 tail.exe资源工具包,作为 gnuwin32 的一部分,在 cygwin\bin 中有 3 个位置,但它只显示一个。 @MiserableVariable,在内存中的(旧)DOS 下,如果您键入echo hello(单词之间有很多空格,这些空格会被忽略,而您只会得到“hello “。如果您使用点变体,它也会输出点和单词之间的空格。XP(至少)似乎已经改变了,所以 first 空格(或点)是忽略,其他的都被保留了。老 IT 人的习惯力量 :-) 这里没有必要,所以我会摆脱它。【参考方案2】:

如果您安装了 Microsoft Platform SDK(the February 2003 version 是最后一个与 Microsoft VC6 一起使用的 SDK),您可以获取 where.exe 程序(它是 38K,如果您 gzip 则只有 18K)并运行

where notepad.exe

来自where 命令的帮助:

WHERE [/R dir] [/Q] [/F] [/T] pattern...

Description:
    Displays the location of files that match the search pattern.
    By default, the search is done along the current directory and
    in the paths specified by the PATH environment variable.

Parameter List:
    /R       Recursively searches and displays the files that match the
             given pattern starting from the specified directory.

    /Q       Returns only the exit code, without displaying the list
             of matched files. (quite mode)

    /F       Displays the matched filename in double quotes.

    /T       Displays the file size, last modified date and time for all
             matched files.

    pattern  Specifies the search pattern for the files to match.
             Wildcards * and ? can be used in the pattern. The
             "$env:pattern" and "path:pattern" formats can also be
             specified, where "env" is an environment variable and
             the search is done in the specified paths of the "env"
             environment variable. These formats should not be used
             with /R. The search is also done by appending the
             extensions of the PATHEXT variable to the pattern.

     /?      Displays this help message.

  NOTE: The tool returns an error level of 0 if the search is
        successful, of 1 if the search is unsuccessful and
        of 2 for failures or errors.

Examples:
    WHERE /?
    WHERE myfilename1 myfile????.*
    WHERE $windir:*.*
    WHERE /R c:\windows *.exe *.dll *.bat
    WHERE /Q ??.???
    WHERE "c:\windows;c:\windows\system32:*.dll"
    WHERE /F /T *.dll

【讨论】:

"where" 默认在 Windows 7 中可用,也许在 Vista 中可用【参考方案3】:

检查键 HKEY_CLASSES_ROOT\Applications\notepad.exe 在本地化版本上是否相同。也许键名相同,编辑/打开的值指向本地化的 exe。 示例:

英语: HKEY_CLASSES_ROOT\Applications\notepad.exe\shell\edit\command %SystemRoot%\system32**NOTEPAD.EXE** %1

荷兰语: HKEY_CLASSES_ROOT\Applications\notepad.exe\shell\edit\command %SystemRoot%\system32**kladblok.exe** %1

如果是这样,那么它只是要检查注册表中的那个键(mspaint 也是如此)。

【讨论】:

听起来是一种可行的方法,是的。前提是假设成立。 (无法检查自己,因为我不在非英语本地化的 Windows 上,并且我在这里没有注册表编辑权限...) 还有其他人有可能检查吗? 至少在德语版本中键是相同的,但是notepad.exe仍然被称为notepad.exe【参考方案4】:

我认为从小处着手,您应该获取windir 环境变量并在子文件夹%windir%\system32\ 中查找mspaintnotepad。 他们很可能会在那里。

但是,如果失败了,那就求助于更暴力的搜索。

【讨论】:

【参考方案5】:

类型:

%windir%\system32\notepad.exe 在路径栏中的东西

C:\Windows\System32 并找到notepad.exe

*C 是你的操作系统所在的硬盘:)

【讨论】:

【参考方案6】:

通常,您只需执行它们。它们位于每个 Windows 版本的系统路径中。

您可以使用ExpandEnvironmentStrings。你要扩展的环境变量是WINDIR

过去您可以使用GetWindowsDirectoryGetSystemDirectory,但我认为它们已被弃用。

【讨论】:

它们没有被弃用,在与旧系统的兼容性方面是最好的。【参考方案7】:

使用 WinAPI 函数 GetWindowsDirectory() 获取 Windows 文件夹,使用 GetSystemDirectory() 获取 Windows\System 文件夹。保证至少可以与 Win95 起的所有 Windows 版本一起使用;我认为它们在 Win 3.x 中也可用。

【讨论】:

【参考方案8】:

由于您使用 WinAPI 标记了问题,我会使用 SearchPath() 例如以下将使用结果填充变量path

//Get the full path to notepad
char path[MAX_PATH] =  0 ;
LPSTR* ptr = NULL;
DWORD dwRet = SearchPath(NULL, "notepad.exe", NULL, MAX_PATH, (LPSTR)path, ptr);

【讨论】:

【参考方案9】:

尝试打开 DOS 提示符,切换到 Windows 文件夹并执行以下操作:

dir notepad.exe /s

DOS 万岁 :)

【讨论】:

技术上正确,但暴力破解 & 仅适用于 windows 文件夹中的内容【参考方案10】:

简而言之,我发现最好的方法 是检查 Windows\System32目录 和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 注册表项。

更一般地说,我发现最好的方法 就是模仿ShellExecuteEx

取自: 应用程序注册 (Windows)https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

在以下位置查找文件: •当前工作目录。 •仅 Windows 目录(不搜索子目录)。 •Windows\System32 目录。 • PATH 环境变量中列出的目录。 •推荐:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

进一步可能是检查Start Menu\Programs\Accessories, 通过使用SHGetFolderPathCSIDL_STARTMENU := 11CSIDL_COMMON_STARTMENU := 22,并检索目标 来自 lnk 文件。

【讨论】:

【参考方案11】:

转到 system32 文件夹并在“文件名”栏中键入“notepad.exe”。

【讨论】:

以上是关于找到notepad.exe和mspaint.exe的路径的主要内容,如果未能解决你的问题,请参考以下文章

无法将notepad++添加到打开方式列表中的解决办法

关于NOTEPAD.EXE

win32 API 搜索路径失败

window2008 r2系统怎么清除notepad.exe病毒

有notepad注册表但是运行不了

Python subprocess.call 打不开 Notepad.exe?