找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28703|回复: 8

[文本处理] BAT如何实现列举搜索特定文件并只运行其中某个?

[复制链接]
发表于 2013-11-3 17:29:11 | 显示全部楼层 |阅读模式
我制作了一个批处理,代码如下

  1. @echo off
  2. for %%A in (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 (
  3.   for /f %%B in ('fsutil fsinfo drivetype %%A: ^| findstr /c:"固定驱动器"') do (
  4.     FOR /F "DELIMS=" %%C IN ('DIR/A/B/S "%%B\DFRG.MSC"') DO (
  5.       IF EXIST "%%C" "%%C"
  6.     )
  7.   )
  8. )>NUL 2>NUL
复制代码
问题是:列举的结果是多于1个DFRG.MSC,而我并不想运行C盘里面的DFRG.MSC。我只想运行C盘之外的其他盘的DFRG.MSC,并且如果其他盘的DFRG.MSC也多于1个的话,则只运行其中一个。请问代码应该如何修改?
发表于 2013-11-3 17:50:27 | 显示全部楼层
本帖最后由 terse 于 2013-11-3 18:18 编辑

看错把 C 去掉 不就排除了
发表于 2013-11-3 21:40:40 | 显示全部楼层
  1. @echo off
  2. for %%A in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  3.     for /f %%B in ('fsutil fsinfo drivetype %%A: ^| findstr /c:"固定驱动器"') do (
  4.         FOR /F "DELIMS=" %%C IN ('DIR/A/B/S "%%B\DFRG.MSC"') DO (
  5.             IF EXIST "%%C" (
  6.                 "%%C"
  7.                 goto :eof
  8.             )
  9.         )
  10.     )
  11. )>NUL 2>NUL
复制代码
 楼主| 发表于 2013-11-8 15:13:37 | 显示全部楼层
回复 3# DAIC


    考虑到要排除一个特定盘符,我将代码改成这样了

  1. @ECHO OFF

  2. set /p target=请输入目标盘符(如 C ):
  3. if "%target%"=="" set target=C
  4. CALL :TEST
  5. PAUSE
  6. exit

  7. :TEST
  8. for %%A in (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 (
  9.     for /f %%B in ('fsutil fsinfo drivetype %%A: ^| findstr /c:"固定驱动器"') do (
  10.         FOR /F "DELIMS=" %%C IN ('DIR/A/B/S "%%B\DFRG.MSC"') DO (
  11.             IF EXIST "%%C" (
  12.                 IF /I NOT "%%~dC"=="%target%:" "%%C"
  13.                 goto :eof
  14.             )
  15.         )
  16.     )
  17. )>nul 2>nul
复制代码
不知这个代码是否需要精简或者更正完善的地方?
发表于 2013-11-8 15:28:05 | 显示全部楼层
回复 4# crist


把排除盘符的功能放到for循环外面
  1. @ECHO OFF
  2. set /p target=请输入目标盘符(如 C ):
  3. if "%target%"=="" set target=C
  4. set "allDrive=C D E F G H I J K L M N O P Q R S T U V W X Y Z"
  5. call set allDrive=%%allDrive:%target%=%%
  6. CALL :TEST
  7. PAUSE
  8. exit

  9. :TEST
  10. for %%A in (%allDrive%) do (
  11.     for /f %%B in ('fsutil fsinfo drivetype %%A: ^| findstr /c:"固定驱动器"') do (
  12.         FOR /F "DELIMS=" %%C IN ('DIR/A/B/S "%%B\DFRG.MSC"') DO (
  13.             IF EXIST "%%C" (
  14.                 "%%C"
  15.                 goto :eof
  16.             )
  17.         )
  18.     )
  19. )>nul 2>nul
复制代码
 楼主| 发表于 2013-11-12 12:48:12 | 显示全部楼层
回复 5# DAIC


谢谢!你的代码测试 通过,请问第五行代码为何要用call呢?
发表于 2013-11-12 13:20:55 | 显示全部楼层
回复 6# crist


    变量延迟扩展
 楼主| 发表于 2013-11-16 14:13:54 | 显示全部楼层
回复 5# DAIC


    你好,又发现一个问题:这个代码可以在Windows xp环境通过,但在winpe 2003通不过(Y盘是RAMDisk,存在Y:\DFRG.MSC,且Y也显示为固定驱动器),请问应该如何解决?
 楼主| 发表于 2013-11-16 15:59:35 | 显示全部楼层
回复 8# crist


    原来是pe中没有自带findstr所致,问题解决。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 18:35 , Processed in 0.030103 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表