Windows如何定位shell中的文件输入?

时间:2013-11-19 15:10:00

标签: windows shell batch-file path cmd

我在网站上查找了这个问题,但看起来它从未被问过,所以我想我会分享给那些寻找它的人的答案。

问:当我输入可执行文件' cmd.exe中的名称,通过shell执行函数或批处理文件,Windows如何找到要调用的外部可执行文件?

3 个答案:

答案 0 :(得分:3)

我不明白“shell-execution function”是指什么,所以我会忽略它。

但是从CMD.EXE命令行或批处理文件启动可执行文件的规则如下:

  1. 如果为可执行文件指定了路径(绝对路径或相对路径),则只搜索该路径。

  2. 如果只指定了可执行文件名(可能还有扩展名),那么

    • 首先搜索当前文件夹

    • 然后在PATH环境变量中搜索文件夹(按列出的顺序)

  3. 在搜索的每个文件夹中,使用提供的扩展名。如果未提供文件扩展名,则查找与PATHEXT环境变量中找到的扩展名匹配的文件(按列出的顺序排列)。

  4. 找到的第一个匹配文件是执行的文件。


    修改

    David Candy向我指出了一些过时的NT文档,它精确地概述了搜索过程,它基本上与我上面写的相符。见Launching Applications from the NT Shell

    如果有人能为更新版本的Windows发布类似CMD.EXE文档的链接,我会喜欢它,特别是如果它是由Microsoft编写的。请注意,上面链接的NT文档是由Microsoft编写的 not ,即使它已在其网站上发布。

答案 1 :(得分:0)

这是使用CreateProcessW启动edit.com的CMD调试。

Microsoft (R) Windows Debugger Version 6.2.9200.20512 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: C:\Windows\System32\cmd.exe
Symbol search path is: srv*C:\tmp*http://msdl.microsoft.com/download/symbols;c:\tmp
Executable search path is: 
ModLoad: 49fe0000 4a030000   cmd.exe 
ModLoad: 76dd0000 76ef7000   ntdll.dll
ModLoad: 75860000 7593b000   C:\Windows\system32\kernel32.dll
ModLoad: 76a20000 76ae6000   C:\Windows\system32\ADVAPI32.dll
ModLoad: 76d00000 76dc2000   C:\Windows\system32\RPCRT4.dll
ModLoad: 75b20000 75bca000   C:\Windows\system32\msvcrt.dll
(58c.918): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
eax=00000000 ebx=00000000 ecx=0027f9a0 edx=76e29a94 esi=fffffffe edi=76e2b6f8
eip=76e17dfe esp=0027f9b8 ebp=0027f9e8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
76e17dfe cc              int     3
0:000> bp kernel32!CreateProcessW
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\system32\kernel32.dll - 
breakpoint 0 redefined
0:000> g
Breakpoint 0 hit
eax=0027f590 ebx=00000000 ecx=00000000 edx=00000000 esi=4a005200 edi=00000001
eip=75861c01 esp=0027f4b4 ebp=0027f674 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
kernel32!CreateProcessW:
75861c01 8bff            mov     edi,edi
0:000> kb
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
0027f4b0 49fe4568 00316078 003175a8 00000000 kernel32!CreateProcessW
0027f674 49fe4315 00317508 00000000 00000000 cmd!ExecPgm+0x20a
0027f8d4 49fe43a8 00317508 00000000 00000000 cmd!ECWork+0x7f
0027f8ec 49fe43ce 00317508 e3a3ec47 00000001 cmd!ExtCom+0x47
0027fd48 49fe185f 00317508 00000002 7588372f cmd!FindFixAndRun+0xb3
0027fd98 49ff70d4 00000000 00317508 4a0041b0 cmd!Dispatch+0x14a
0027fddc 49fe985b 00000001 000a0f38 000a1840 cmd!main+0x21a
0027fe20 758a4911 7ffdb000 0027fe6c 76e0e4b6 cmd!_initterm_e+0x163
0027fe2c 76e0e4b6 7ffdb000 7871d1d4 00000000 kernel32!BaseThreadInitThunk+0x12
0027fe6c 76e0e489 49fe9797 7ffdb000 00000000 ntdll!RtlInitializeExceptionChain+0x63
0027fe84 00000000 49fe9797 7ffdb000 00000000 ntdll!RtlInitializeExceptionChain+0x36
0:000> du 316078
00316078  "C:\Windows\system32\edit.com"

答案 2 :(得分:-3)

请参阅CreateProcess。

  1. 加载应用程序的目录。
  2. 父进程的当前目录。
  3. 32位Windows系统目录。使用GetSystemDirectory函数获取此目录的路径。 Windows Me / 98/95:Windows系统目录。使用GetSystemDirectory函数获取此目录的路径。
  4. 16位Windows系统目录。没有函数可以获取此目录的路径,但会搜索它。该目录的名称是System。
  5. Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
  6. PATH环境变量中列出的目录。请注意,此功能不会搜索App Paths注册表项指定的每个应用程序路径。要在搜索序列中包含此每个应用程序路径,请使用ShellExecute函数。