如何在发现DIR / S之后停止搜索DIR / S.

时间:2011-08-09 18:31:16

标签: batch-file cmd windows-scripting

我正在尝试在BATCH中查找驱动器中的文件,因此我使用了以下命令:

DIR c:\directory\* /s/b | FIND "filename.txt"

问题是,一旦我找到该文件,它仍会搜索...所以我想知道是否有一个参数或某些内容会在找到至少1个结果后停止搜索。

修改

我正在尝试像

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

然后我会在复制命令完成后添加另一个命令行来退出循环。

5 个答案:

答案 0 :(得分:1)

这里有一个类似的问题:Exit in For loop - Windows Command Processor (CMD.EXE)

而不是:DIR c:\directory\* /s/b | FIND "filename.txt"

你可以使用:DIR /s /b c:\directory\filename.txt

结果并不像我期望的那样...... :-)试一试! (您也可以使用通配符“filename.txt”)

答案 1 :(得分:0)

你唯一能做的就是:

DIR c:\directory* /s/b | FIND "filename.txt" | more

这样,如果找到超过一页的结果,则需要按Enter键。但这不会阻止dir /s,因为你无法告诉它什么时候停止。

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

在此示例中,我使用Locate32而不是dir | find。看一下它,它类似于schnaader建议在文本文件中存储所有文件的列表。 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

答案 2 :(得分:0)

可能有一些聪明的伎俩,比如在获得结果后将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

之后,您可以只在{em>多的索引中放置FIND个文件,尽管您可能不得不每隔一段时间重新创建索引。

答案 3 :(得分:0)

您不能将循环限制为秒,而是要循环它的次数。我不确定以下示例是否与您的具体问题有关,但我想用假病毒吓唬我的朋友。我发现你可以在记事本中发出命令时暂停它。例如:(@ echo OFF你正在被黑客攻击dir / s暂停。这会暂停一个dir / s所以它不在一个循环中所以它是单数,这也会让它持续一秒钟(dir多长时间) / s单数是。)你可以通过输入更多来扩展它。例如:(@ echo OFF echo你被黑了dir / s dir / s dir / s dir / s暂停(这将使它继续至少5它停止前几秒钟。我希望这有帮助并且可以理解。

答案 4 :(得分:0)

我知道在设置变量之前无需搜索整个设备的唯一方法就是使用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%"