1

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

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

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

编辑

我正在尝试类似的东西

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

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

4

5 回答 5

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”使用通配符)

于 2013-05-27T15:04:25.217 回答
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

之后,您可以只FIND将文件放入索引中,这会更快,尽管您可能需要不时地重新创建索引。

于 2011-08-09T18:40:27.637 回答
0

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

于 2013-04-26T02:45:51.453 回答
0

你唯一能做的就是:

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

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

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

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

下一个示例搜索cmd.exec:\windows 下面的某个位置。它搜索整个文件名,因此找不到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
于 2011-08-09T18:35:41.293 回答
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%"
于 2018-08-30T00:22:55.260 回答