【问题标题】:Find a file under a partially known folder path在部分已知的文件夹路径下查找文件
【发布时间】:2018-05-24 19:26:44
【问题描述】:

我对批处理文件很陌生。我正在尝试编写脚本来查找此文件:

A\Org\App\B\C\SQL Scripts\Miscellaneous\CRErrorFinder.exe

地点:

  • A 是任何驱动器
    示例值 C:
  • B 文件夹名称
    示例值 TEST
  • C 文件夹名称,应以已知数字开头,例如85.
    示例值850-0

我尝试了什么:

我可以遍历驱动器以获取我的根搜索文件夹,(类似于C:\Org\App\D:\Org\App\,然后对BC 使用另外两个循环。但是有没有更短的方法来实现我在这里所做的事情?

【问题讨论】:

标签: windows batch-file cmd


【解决方案1】:

我认为唯一安全的方法是为所有部分建立循环:驱动器号、文件夹B(任何东西,*)和文件夹C85*)。以下代码示例中最内层的循环仅迭代一次并返回文件而不访问文件系统,因为没有通配符*?(这是for 的本质);这就是为什么使用if exist 的原因——两次是为了只匹配文件而不是目录(注意后面的\ 用于第二个,not 不用于文件夹):

for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    for /D %%B in ("%%A:\Org\App\*") do (
        for /D %%C in ("%%~B\85*") do (
            for %%D in ("%%~C\SQL Scripts\Miscellaneous\CRErrorFinder.exe") do (
                if exist "%%~D" if not exist "%%~D\" (
                    echo(%%~D
                )
            )
        )
    )
)

找到的路径被简单地回显。


可能还有另一种使用dir /Sfindstr 的方法,但您仍然需要遍历驱动器号:

for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    dir /B /S /A:-D "%%A:\CRErrorFinder.exe" | findstr /R /I /X /C:".:\\Org\\App\\[^\\][^\\]*\\85[^\\]*\\SQL Scripts\\Miscellaneous\\CRErrorFinder\.exe"
)

请注意,. 表示任何字符,\\ 是文字 \[^\\] 是除 \ 之外的字符,* 表示前面的表达式零次或多次,\. 是文字.


您可以通过wmic 收集系统上实际可用的驱动器,然后通过for /F 捕获它们,而不是遍历字母表,如下所示:

  1. subst建立的所有驱动器,包括网络驱动器等:

    for /F "skip=1" %%A in ('wmic LogicalDisk get DeviceID') do for /F "delims=:" %%A in ("%%A") do (
        rem %%A holds the pure drive letter.
    )
    
  2. 仅限本地驱动器:

    for /F "skip=1" %%A in ('wmic Volume where "DriveLetter is not Null" get DriveLetter') do for /F "delims=:" %%A in ("%%A") do (
        rem %%A holds the pure drive letter.
    )
    

    或者(快一点):

    for /F "delims=:\ " %%A in ('mountvol ^| find ":\"') do (
        rem %%A holds the pure drive letter.
    )
    

这些方法可用于上述两种方法,而不是 for %%A 循环。

【讨论】:

  • 对于驱动器号,作为补充,如果您喜欢For /F "Tokens=* Delims=\ " %%A In ('MountVol^|Find ":\"') Do Echo %%A 或更简单的For /F %%A In ('MountVol^|Find ":\"') Do Echo %%A(我猜加载WMIC 会更快!)
  • @Compo,在我的系统上(Windows 7)mountvol 不带参数只会抛出帮助页面...
  • aschipfl,你试过MountVol|Find ":\"这个命令了吗?还是只是MountVol?并且您没有注意到输出中有任何已安装的驱动器号。 XP 开始,我就一直在使用特定的For 循环,可能是2000,我从来不知道它不能按预期工作!
  • @Compo,是的,我做到了,结果是C:`, E:`,D:`, which I interpreted as sample output rather than actual ones; however, these are just the local drives, of course, any network drives or such established by subst` 不是由mountvol 返回的,所以这最终取决于 OP 想要什么。还是谢谢!
  • 顺便说一下,wmic Volume where "DriveLetter is not Null" get DriveLetter 给出的结果与mountvol 相同,因此仅本地驱动器...
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2017-11-24
相关资源
最近更新 更多