Batch file 为什么不是';";fciv“;在批处理文件中正确识别的命令,带有;至于;自行车?

Batch file 为什么不是';";fciv“;在批处理文件中正确识别的命令,带有;至于;自行车?,batch-file,for-loop,command-line,fciv,Batch File,For Loop,Command Line,Fciv,假设fciv.exe文件已放置在系统目录C:\WINDOWS\system32中,则无论是从命令提示符调用还是在批处理脚本文件中使用,它都能正常工作。例如: @echo off fciv -md5 C:\DOCUME~1\myUsername pause 上述说法很有效。 但是,如果我在循环中使用fciv,如下例所示: @echo off for /f "tokens=1 delims=/ " %%g in ('fciv -md5 C:\DOCUME~1\myUsername') do (ec

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

@echo off
fciv -md5 C:\DOCUME~1\myUsername
pause
上述说法很有效。 但是,如果我在
循环中使用
fciv
,如下例所示:

@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
变量。
为了正确解释为批处理文件中
循环的
命令,我必须使用
fciv.exe
文件的完整路径。
有人能解释一下为什么会发生这种情况吗?

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

提问者的批处理文件只包含
fciv
,而不是
fciv.exe
,或者更好的
“Full\Path To\fciv.exe”

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

在运行
fciv
的行上方的批处理文件中,添加了为用户帐户定义的环境变量PATH,删除了包含
fciv.exe
的目录路径。因此,Windows在执行批处理文件时找不到此应用程序

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

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

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

  • 差是:
    fciv
  • 更好的是:
    fciv.exe
  • 最好的方法是:
    “指向\fciv.exe的完整路径”

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

这是一个很长的过程,但是,批处理脚本是否修改了
%PATH%
变量?谢谢您的评论。是的,不幸的是,我刚刚注意到上面的一些行,我将
set/p
命令的输出变量定义为
%PATH%
,因此它实际上替换了环境变量。