如何停止限制搜索的DIR /S后,它发现了一些东西



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

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

问题是一旦我找到文件,它仍然搜索…所以我想知道是否有一个参数或其他东西,会在它找到至少一个结果后停止搜索。

编辑

我正在尝试像

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

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

这里有一个类似的问题:退出For循环- Windows命令处理器(CMD.EXE)

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

可以这样写:DIR /s /b c:directoryfilename.txt

结果不是我所期望的…(-)试试!
(也可以对"filename.txt"使用通配符)

可能有一些聪明的技巧,比如在得到结果后发送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

之后,您可以在索引中FIND文件,这是快得多的,尽管您可能需要不时重新创建索引。

你唯一能做的就是:

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

这样,如果找到超过一页的结果,您需要按enter键。但这不会停止dir /s,因为你不能告诉它何时停止。

edit:关于你如何停止for循环的评论,见下文。

代替dir | find,我在这个例子中使用Locate32。看一下它,它类似于schnaader在文本文件中存储所有文件列表的建议。Locate32创建了一个数据库,并能够根据时间表自动更新它。你可以在数据库中快速搜索。

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

@echo off
FOR /f %%G IN ('"C:Program FilesLocateLocate.exe" -p c:windows -lw cmd.exe') do (
  echo %%G
  goto :skip
)
:skip
echo done

你不能用秒来限制循环,而是你想循环多少次。我不确定下面的例子是否与你的具体问题有关,但我喜欢用假病毒吓唬我的朋友。我发现你可以在记事本中创建命令时暂停它。例如:@echo OFF echo你正在被黑客攻击dir/s pause。这将暂停一个dir/s,所以它不是在循环中,所以它是单数,这也将使它持续一秒钟(dir/s的单数长度)。您可以通过输入更多内容来扩展它。例如:@echo OFF echo你正在被黑客攻击dir/s dir/s dir/s dir/s pause(这将使它在停止之前至少持续5秒。)

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

最新更新