为什么只在文件目录中批量搜索文件.bat?



我正在尝试批量制作文件搜索引擎,但它只搜索.bat文件所在的 folred 中的文件。 这是完整的代码:

@echo off
title Search engine
set path=%HOMEDRIVE%
set filename=%empty%
set filextension=%empty%
cls
REM echo Under the construction
REM pause
REM call main.bat
:search
cls
echo Where do you want to search? (Leave empty for %HOMEDRIVE%)
set /p path=
:name
cls
echo Whats the name of your file? (Without extension)
set /p filename=
if %filename% == %empty% goto :name
:extension
cls
echo What's the extension of your file?
set /p filextension=
if %filextension% == %empty% goto :extension
goto :searchingMessage
:searchingMessage
cls
echo Searching %filename%.%filextension% in %path% (This may take a while)
goto :searching
:searching
for /r %path% %%a in (*) do if "%%~nxa"=="%filename%.%filextension%" set p=%%~dpnxa
if defined p (
echo File found under %p%
) else (
echo File not found
)
pause
call main.bat

谢谢。如果事情很简单,我很抱歉。我是该批次的新手

  1. #echo off后使用setlocal行。这可确保在一次运行中在代码中set的变量不会保留在同一cmd实例中的下一次运行中。

  2. 切勿更改变量的值path。它是系统定义的,包含以分号分隔的有序列表,其中包含在当前目录中找不到可执行文件时

    搜索可执行文件的目录。
  3. 使用语法set "var=value"进行字符串赋值。此语法可确保set命令中的任何尾随空格不会追加到分配给变量的值。

  4. 要分配值为零(这实际上会从环境中删除变量),请使用语法set "var="。您使用的代码会将变量设置为与变量的值连接empty。在批处理中,%转义%,而不是转义,并且^转义其他通常需要转义的角色。

  5. 如果var为空if %var% == dosomething如果something,则if == dosomething,则if %var% == something dosomething将被解释为if == something dosomething;所有这些都会生成语法错误,因为if后面的第二个字符串不是像==那样的比较运算符。要检测,请根据需要使用if defined var dosomethingif not defined var dosomethingif defined var (dosomething) else (dosomethingelse)- 请注意,如果使用字符串) else (则必须全部位于同一物理线路上。

  6. 请注意,如果响应只是Enter,则set /p var=whatever或最好是set /p "var=whatever"不会更改var。因此,谨慎的做法是在set/p之前对行执行set "var="。此特征可用于设置默认值:

set "var=xyz"
set /p "var=new value for var [%var%] ^> "

它应该提示new value for var [xyz] >,如果响应只是Enter,则将保留xyz作为var的值。请注意,此处>是一个特殊字符(重定向器),因此它被^转义。

  1. 请注意,如果在for /r ...行之前定义了p并且找不到文件,则p不会被for /r赋值,并将保留其原始值。鉴于第 (1) 点,这一点尤其重要,在该点中,两次运行之间可能会保留p。但是 - 请注意使用此特性的可能性...
set "p=File not found"
for /r ....
echo %p%

。并且请使用更具表现力的变量名称。

最新更新