Batch file 如何在找到某个目录后停止限制对该目录的搜索

Batch file 如何在找到某个目录后停止限制对该目录的搜索,batch-file,cmd,windows-scripting,Batch File,Cmd,Windows Scripting,我试图在驱动器中批量查找文件,因此使用了以下命令: DIR c:\directory\* /s/b | FIND "filename.txt" 问题是,一旦我找到文件,它仍然会搜索…所以我想知道是否有一个参数或某些东西会在它找到至少一个结果后停止搜索 编辑 我在尝试类似的东西 FOR %%G IN (DIR c:\directory\* /s/b | FIND "filename.txt") DO copy %%G 然后,我将添加另一个命令行,以便在复制命令完成后退出循环。您唯一可以做的是

我试图在驱动器中批量查找文件,因此使用了以下命令:

DIR c:\directory\* /s/b | FIND "filename.txt"
问题是,一旦我找到文件,它仍然会搜索…所以我想知道是否有一个参数或某些东西会在它找到至少一个结果后停止搜索

编辑

我在尝试类似的东西

FOR %%G IN (DIR c:\directory\* /s/b | FIND "filename.txt") DO copy %%G 

然后,我将添加另一个命令行,以便在复制命令完成后退出循环。

您唯一可以做的是:

DIR c:\directory* /s/b | FIND "filename.txt" | more
这样,如果找到的结果超过一页,则需要按enter键。但这不会停止
目录/s
,因为您无法告诉它何时停止

编辑:关于您对如何停止for循环的评论,请参见下文

我在本例中使用的不是
dir | find
。看一看,它类似于在文本文件中存储所有文件的列表的建议。Locate32创建一个数据库,并能够根据计划自动更新它。您可以在数据库中快速搜索

下一个示例在c:\windows下面的某个位置搜索
cmd.exe
。它搜索整个文件名,因此找不到
appcmd.exe
。由于
goto:skip
,它会在显示第一个结果后停止

@echo off

FOR /f %%G IN ('"C:\Program Files\Locate\Locate.exe" -p c:\windows -lw cmd.exe') do (
  echo %%G
  goto :skip
)

:skip
echo done

你唯一能做的就是:

DIR c:\directory* /s/b | FIND "filename.txt" | more
这样,如果找到的结果超过一页,则需要按enter键。但这不会停止
目录/s
,因为您无法告诉它何时停止

编辑:关于您对如何停止for循环的评论,请参见下文

我在本例中使用的不是
dir | find
。看一看,它类似于在文本文件中存储所有文件的列表的建议。Locate32创建一个数据库,并能够根据计划自动更新它。您可以在数据库中快速搜索

下一个示例在c:\windows下面的某个位置搜索
cmd.exe
。它搜索整个文件名,因此找不到
appcmd.exe
。由于
goto:skip
,它会在显示第一个结果后停止

@echo off

FOR /f %%G IN ('"C:\Program Files\Locate\Locate.exe" -p c:\windows -lw cmd.exe') do (
  echo %%G
  goto :skip
)

:skip
echo done

可能有一些聪明的技巧,比如在得到结果后将Ctrl+C发送到DIR,或者Windows Powershell会有所帮助,但我对此表示怀疑。此外,我不知道任何参数来控制它的结果数量,我认为也没有

如果您想做这样的事情,请使用您最喜欢的编程语言并在那里进行。批处理脚本功能强大,但有些事情太复杂,或者思考解决方案会浪费太多时间

顺便说一句,如果您经常执行这样的
FIND
操作,我建议如下:

 REM Script to build a filename index for all your drives

 DIR C:\* /s /b > index.txt
 DIR D:\* /s /b >> index.txt
 REM ...more drives here

 REM And you might want to compress index.txt afterwards

之后,您只需
在索引中查找
文件,虽然您可能需要时不时地重新创建索引,但速度要快得多。

可能会有一些巧妙的技巧,例如在获得结果后将Ctrl+C发送到DIR,或者Windows Powershell可能会有所帮助,但我对此表示怀疑。此外,我不知道任何参数来控制它的结果数量,我认为也没有

如果您想做这样的事情,请使用您最喜欢的编程语言并在那里进行。批处理脚本功能强大,但有些事情太复杂,或者思考解决方案会浪费太多时间

顺便说一句,如果您经常执行这样的
FIND
操作,我建议如下:

 REM Script to build a filename index for all your drives

 DIR C:\* /s /b > index.txt
 DIR D:\* /s /b >> index.txt
 REM ...more drives here

 REM And you might want to compress index.txt afterwards

之后,您只需
在索引中查找
文件,虽然您可能需要时不时地重新创建索引,但速度要快得多。

您不能以秒为单位限制循环次数,但要限制循环次数。我不确定下面的例子是否与你的具体问题有关,但我喜欢用假病毒吓唬我的朋友。我发现您可以在记事本中执行命令时暂停它。例如:(@echo OFF echo you hacked dir/s pause。这会暂停一个dir/s,使其不在循环中,因此它是单数的,这也会使它持续一秒钟(dir/s单数的时间)。您可以通过键入更多来扩展它。例如:(@echo OFF echo you hacked dir/s dir/s dir/s dir/s pause(这将使它在停止前至少持续5秒。我希望这有帮助,并且可以理解。

你不能以秒限制循环,但你想循环多少次。我不确定以下示例是否与你的具体问题有关,但我喜欢用假病毒吓唬我的朋友。我发现你可以在maki时暂停它在notepad.Ex:(@echo OFF echo you hacked dir/s pause。这会暂停一个dir/s,使其不在循环中,因此它是单数的,这也会使它持续一秒钟(dir/s单数的长度)。您可以通过键入更多来扩展它。Ex:(@echo OFF echo you hacked dir/s dir/s dir/s dir/s pause)(这将使它在停止前至少持续5秒钟。我希望这有帮助,并且可以理解。

这里有一个类似的问题:

而不是:
dirc:\directory\*/s/b;查找“filename.txt”

您可以使用以下命令:
DIR/s/b c:\directory\filename.txt

结果并不像我预期的那样…:-)试试看!

(您也可以对“filename.txt”使用通配符)

这里有一个类似的问题:

而不是:
dirc:\directory\*/s/b;查找“filename.txt”

您可以使用以下命令:
DIR/s/b c:\directory\filename.txt

结果并不像我预期的那样…:-)试试看!

(您也可以对“filename.txt”使用通配符)

在设置变量之前,我所知道的不搜索整个设备的唯一方法是使用PowerShell。在2011年提出这个问题时,这可能没有那么明显

cmd FOR循环将在执行DO块之前完成该命令。PowerShell管道会在找到数据时将其推送通过

@ECHO OFF
FOR /F "delims=" %%f IN (' ^
    powershell -NoProfile -Command ^
        "Get-ChildItem -Path 'C:\' -Recurse -Filter '*testfile.jar' -ErrorAction SilentlyContinue |" ^
        "Select-Object -First 1 |" ^
        "ForEach-Object { $_.FullName }" ^
    ') DO (
    SET "FN=%%~f"
)

ECHO "%FN%"

我知道的唯一方法就是不用