FINDSTR 在从 Windows XP 到 Windows server 2012 的所有 Windows OS 上的位置是什么?

What is the location of FINDSTR on all Windows OS from Windows XP to Windows server 2012?

对于从 Windows XP 到服务器 2012 的所有 OS,findstr 的目录总是 C:\Windows\system32\ 吗?

或者换句话说,在 windows 批处理文件中替换以下表达式是否安全:

findstr

C:\Windows\system32\findstr

而不是 %windir%\system32\findstr.exe 因为它可能 windows 安装在与 C:\ 不同的驱动器上。

额外信息只是为了完整性。

环境变量 windir 自 Windows 95 以来就存在,并且包含到 Windows 目录的路径,与它所在的驱动器和名称无关。

对于基于 NT 的 Windows(NT4、Windows 2000、Windows XP、Vista、Windows 7 / 8 / 8.1),还有环境变量 SystemRoot 其中还包含 Windows 目录的路径,因为这是系统目录

的父目录
  • System32
  • Sysnative(仅 Windows x64 且仅适用于 32 位应用程序)
  • SysWOW64(仅 Windows x64)

有关文件系统重定向的详细信息,请阅读 Microsoft 的 File System Redirector 页面。

不仅可以安全使用

%windir%\System32\findstr.exe

%SystemRoot%\System32\findstr.exe

我强烈建议在批处理文件中始终使用这两个字符串之一,因为它不依赖于环境变量 PATH 中的文件夹以及环境变量中的文件扩展名 PATHEXT.

有一些错误的安装程序会在开始时将已安装应用程序的文件夹路径添加到系统环境变量 PATH 而不是附加在末尾,并且还包含在应用程序的文件夹中 find.exefindstr.exe 是从 Unix 移植过来的,因此与 Windows 的 find.exefindstr.exe 完全不同。 AVRStudio 是(或者可能未使用最新版本的 AVRStudio 验证)一个示例,它破坏了 IT 管理员的批处理文件,在安装后未对 Windows 命令使用始终完整的文件名。

恐怕我不明白你问题的目的,所以我用稍微不同的方式重新表述一下。

如果你在电脑上输入findstrFINDSTR command运行,那么你可能会这样知道这样的findstr命令的位置:

for %%a in (findstr.exe) do echo %%~$PATH:a

因此您可以替换以下表达式:

findstr

... 通过接下来的两行:

for %%a in (findstr.exe) do set "findstrPath=%~$PATH:a"
%findstrPath%

...在 Windows 批处理文件中,您将得到 完全 相同的结果。

那么,问题来了:如果在两种情况下得到相同的结果,为什么要使用第二种更复杂的方法?

还请注意,同样的观点适用于任何其他外部命令,如 findxcopyforfiles 等。为什么 findstr 在这一点上很特殊?

正如我之前所说,我不明白你的问题的目的...