web-dev-qa-db-ja.com

notepad.exeとmspaint.exeのパスを見つける

Notepad.exeとmspaint.exeがWindowsのさまざまなバージョンで機能する場所を見つける最良の方法は何ですか?

SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir) でWindowsディレクトリを取得し、すべてのサブディレクトリを走査して2つのファイルを探す必要がありますか?

(Windowsフォルダー以外のものには興味がないと仮定します。)

26

これは、(XP +)にアクセスできるすべてのWindowsボックスで機能します。

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%を使用するためにhaveを使用しないことです。別の環境変数を使用して独自の検索パスに置き換えることができます。

41
paxdiablo

Microsoft Platform SDKがインストールされている場合( 2003年2月バージョン はMicrosoft VC6で動作する最後のものです)、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
18
Jason S

キー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でも同様です)。

3
Stefan

タイプ:

パスバーThinggyの%windir%\ system32\notepad.exe

または

C:\ Windows\System32およびnotepad.exeを見つける

* Cは、OSが配置されているハードドライブです。

3
LukasFT

小さなことから始めて、windir環境変数を取得し、サブフォルダー%windir%\system32\ for mspaintおよびnotepad。おそらく彼らはそこにいるでしょう。

ただし、それが失敗した場合は、より強引な検索に頼ってください。

2
Roman M

通常、それらを実行するだけです。これらは、Windowsのすべてのバージョンのシステムパス上にあります。

ExpandEnvironmentStrings を使用できます。展開する環境変数はWINDIRです。

過去にはGetWindowsDirectoryまたはGetSystemDirectoryを使用できましたが、これらは非推奨だと思います。

2
Bogdan

質問に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);
1
nabiy

DOSプロンプトを開いて、Windowsフォルダーに移動して、以下を実行してください。

dir notepad.exe /s

ロングライブDOS :)

0
tehvan

手短に言えば、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およびCSIDL_STARTMENU := 11SHGetFolderPathを使用してCSIDL_COMMON_STARTMENU := 22を確認し、lnkファイルからターゲットを取得することもできます。

0
vafylec

WinAPI関数GetWindowsDirectory()を使用してWindowsフォルダーを取得し、GetSystemDirectory()を使用してWindows\Systemフォルダーを取得します。少なくともWin95以降、すべてのWindowsバージョンで動作することが保証されています。 Win 3.xでも同様に利用できたと思います。

0
Ken White