我正在尝试批量制作文件搜索引擎,但它只搜索.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
谢谢。如果事情很简单,我很抱歉。我是该批次的新手
-
在
#echo off
后使用setlocal
行。这可确保在一次运行中在代码中set
的变量不会保留在同一cmd
实例中的下一次运行中。 -
切勿更改变量的值
搜索可执行文件的目录。path
。它是系统定义的,包含以分号分隔的有序列表,其中包含在当前目录中找不到可执行文件时 -
使用语法
set "var=value"
进行字符串赋值。此语法可确保set
命令中的任何尾随空格不会追加到分配给变量的值。 -
要分配值为零(这实际上会从环境中删除变量),请使用语法
set "var="
。您使用的代码会将变量设置为与变量的值连接
empty
。在批处理中,%
转义%
,而不是转义,并且
^
转义其他通常需要转义的角色。 -
如果
var
为空,if %var% == dosomething
如果something
为空,则if == dosomething
,则if %var% == something dosomething
将被解释为if == something dosomething
;所有这些都会生成语法错误,因为if
后面的第二个字符串不是像==
那样的比较运算符。要检测空,请根据需要使用if defined var dosomething
、if not defined var dosomething
或if defined var (dosomething) else (dosomethingelse)
- 请注意,如果使用字符串) else (
,则必须全部位于同一物理线路上。 -
请注意,如果响应只是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
的值。请注意,此处>
是一个特殊字符(重定向器),因此它被^
转义。
- 请注意,如果在
for /r ...
行之前定义了p
并且找不到文件,则p
不会被for /r
赋值,并将保留其原始值。鉴于第 (1) 点,这一点尤其重要,在该点中,两次运行之间可能会保留p
。但是 - 请注意使用此特性的可能性...
set "p=File not found"
for /r ....
echo %p%
。并且请使用更具表现力的变量名称。