我试图在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%"