Board logo

标题: [出题]批处理搜索某文件夹并显示该文件夹的父目录 [打印本页]

作者: 随风    时间: 2010-1-17 21:27     标题: [出题]批处理搜索某文件夹并显示该文件夹的父目录

出题:搜索某文件夹,并显示该文件夹的父目录
搜索当前目录下的所有目录(含子目录),发现有update文件夹就显示它的父目录
若出现子目录也有update时,则显示第一级update文件夹的父目录
如:c:\1\2\update\abc\update 则显示 c:\1\2
注意:不能重复显示.
此题来源与 http://www.bathome.net/thread-6978-1-1.html
发现实现起来有点困难,现作为一题,希望大家都来参与
作者: 523066680    时间: 2010-1-18 11:39

若出现子目录也有update时,则显示第一级update文件夹的父目录
如:c:\1\2\update\abc\update 则显示 c:\1\2
注意:不能重复显示.

我理解成这样的:   就是这个目录已经是 update  如果里面还有update  我不用管他
因为不应该重复显示  最顶端update 的父目录。

所以¥@!#%!¥%#  读到第一层update 的时候,就不进去了。显示父目录
并搜索其他目录。

额,因为是有层次的操作。不管效率,先用call的 ,代码比较简单。
速度奇慢,而且遇到某些字符还可能XX
  1. @echo off
  2. call :next "D:"
  3. pause
  4. exit
  5. :next
  6. for /f "tokens=*" %%a in ('dir "%~s1" /ad /b') do (
  7.   if "%%a"=="update" (echo  "%~1\%%a") else (
  8.          call :next "%~1\%%a"
  9.   )
  10. )
复制代码

[ 本帖最后由 523066680 于 2010-1-18 12:03 编辑 ]
作者: vsbat    时间: 2010-1-18 12:02

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /s /ad /b C:\^|findstr /e  "\\update"') do (
  4. set "t=%%i"&set "t=!t:\update=+!"
  5. for /f "delims=+" %%j in ("!t!") do (
  6. set "_%%j=vsbat"
  7. )
  8. )
  9. for /f "tokens=1 delims=_=" %%h in ('set _') do echo %%h
  10. endlocal
  11. pause
复制代码
交卷----
吃饭去喽---
大家注意:万一 update 在根目录的情况

[ 本帖最后由 vsbat 于 2010-1-18 13:12 编辑 ]
作者: rwxyxy    时间: 2010-1-18 19:06

  1. @echo off&setlocal enabledelayedexpansion
  2. echo %cd%\ | findstr /I "nul'>\\update\\">nul && set yy=yy
  3. if defined yy (for /f "delims=" %%a in ('echo %cd%\ ^| findstr /I "\\update\\"') do (
  4.     set str=%%a
  5.     for /f "delims=*" %%b in ('echo !str:\update\^=*!') do echo %%b
  6. )) else (for /f "delims=" %%c in ('dir /ad /b /s^|findstr /I /E "update"') do (echo %%~dPc|findstr /I "\\update\\" >nul||echo %%~dPc))
  7. pause>nul
复制代码

现在可以在任何目录下执行,包括当前就在update目录下,或者在 *\update\*\update 目录下的情况测试通过;

[ 本帖最后由 rwxyxy 于 2010-1-19 18:34 编辑 ]
作者: vsbat    时间: 2010-1-18 20:51

回复楼上:

我的意思是 要做到可以包含这种情况
作者: batman    时间: 2010-1-18 21:05

用*通配符解决在根目录下的问题
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /ad /b /s *update') do (
  3.     if /i "%%~na" equ "update" (
  4.        set "str=%%a"&set "str=!str:update=/!"
  5.        for /f "delims=/" %%a in ("!str!") do (
  6.            if not defined _%%a echo %%a&set "_%%a=a"
  7.        )
  8.     )
  9. )
  10. pause>nul   
复制代码

作者: zqz0012005    时间: 2010-1-19 13:01

  1. @echo off
  2. rem if /i "%cd:~-6%"=="update" echo %cd:~,-6%&pause&exit /b
  3. rem 用for对特殊字符的兼容性好一点(如&^)。当然如果不介意,可以加引号以避免
  4. for %%a in ("%cd%") do if /i "%%~nxa"=="update" echo %%~dpa&pause&exit /b
  5. for /f "delims=" %%a in ('dir /ad/s/b update*') do if /i "%%~nxa"=="update" if "%%~dpa" neq "%%~da\" (if not exist "%%~dpa..\update\" echo %%~dpa) else echo %%~dpa
  6. pause
复制代码

作者: a590687    时间: 2010-1-19 14:41     标题: 看我的怎么样

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir/ad/s/b d:\^|findstr /e /i "update"') do (
  3.     set "str=%%i"
  4.     set "a=!str:update=update?!"
  5.     for /f "delims=?" %%j in ("!a!") do (
  6.         set "b=%%j"
  7.         if not defined !b! (
  8.          set !b!=000
  9.         set "c=!b:~,-6!"
  10.         echo !c! )
  11.     )      
  12. )
  13. pause
  14. ::把d:\改成你想搜索的路径就可以了
复制代码

[ 本帖最后由 a590687 于 2010-1-19 15:02 编辑 ]
作者: wxcute    时间: 2010-1-19 20:47     标题: 题目跟那个“保留关键字目录,删除其他目录”异曲同工。

我也来个:
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set fd=%~dp0
  4. cd/d %fd%
  5. for /f "delims=" %%d in ('dir/s/ad/b update? 2^>nul')do (
  6.  if exist %%~dpdupdate\ (
  7.   set nd=%%d
  8.   set nd=!nd:%fd%=!
  9.   set nd=!nd:update=/!
  10.   set nd=!nd:*/=!
  11.   if "!nd!?"=="?" echo "%%~dpd"
  12.  )
  13. )
  14. pause
复制代码

作者: zqz0012005    时间: 2010-1-20 15:13

楼上的 if exist %%~dpdupdate\ 这个判断效率不太好喔。
如果同时存在update、update2、update?,则对每个目录都要执行一次if里面的子句。
不如直接用 if /i "%%~nxd"=="update"




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2