2

假设该fciv.exe文件已放置在系统目录C:\WINDOWS\system32中,则无论是从命令提示符中调用它还是在批处理脚本文件中使用它时,它都能正常工作。例如:

@echo off
fciv -md5 C:\DOCUME~1\myUsername
pause

上述陈述运作良好。但是,如果我fcivfor循环中使用,如下例所示:

@echo off
for /f "tokens=1 delims=/ " %%g in ('fciv -md5 C:\DOCUME~1\myUsername') do (echo %%g)

该命令无法识别,并且从命令提示符返回错误:

"fciv" is not recognized as internal or external command, etc.

相同的语句在命令提示符下有效 - 当然使用%g变量。
为了for在批处理文件中的循环中正确解释为命令,我被迫使用fciv.exe文件的完整路径。
有谁能解释我为什么会发生这种情况?

4

1 回答 1

1

MC ND已经在评论中给出了正确的答案,这里重复作为答案。

提问者的批处理文件只包含fciv而不是fciv.exe甚至更好"Full\Path To\fciv.exe"

因此,Windows 首先在当前工作目录中搜索具有环境变量PATHEXTfciv.*中列出的扩展名之一的文件,并用分号分隔,如果找不到具有这种文件扩展名的文件,则在环境变量PATH中列出的所有目录中也分隔用分号。

并且为用户帐户定义的环境变量PATHfciv在运行的行上方的批处理文件中进行了额外修改,并删除了包含fciv.exe. 因此,Windows 在执行批处理文件时找不到此应用程序。

提示 1:
对于在批处理文件中调用或启动的应用程序,最好使用文件扩展名指定应用程序的文件名,因为 Windows 可以直接搜索fciv.exe而不是fciv.*查找扩展名为 COM、EXE、BAT 的文件, ...

提示 2:
如果路径是固定的,最好用完整路径指定被调用或启动的应用程序的文件名

  • 如果批处理文件仅在一台计算机上执行,
  • 或者应用程序确实安装在同一目录中的所有计算机上,
  • 或者仅当客户端执行批处理文件并通过服务器上的公共共享直接调用/启动应用程序时,才将应用程序安装在服务器上。

结论:

  • 可怜的是:   fciv
  • 更好的是:fciv.exe
  • 最好的是:   "Full\Path To\fciv.exe"

应用程序的最佳引用并不总是可能的,但几乎总是可以使用文件扩展名引用应用程序文件名。

于 2014-07-24T21:27:49.253 回答