标题: [出题]批处理搜索某文件夹并显示该文件夹的父目录 [打印本页]
作者: 随风 时间: 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- @echo off
- call :next "D:"
- pause
- exit
-
- :next
- for /f "tokens=*" %%a in ('dir "%~s1" /ad /b') do (
- if "%%a"=="update" (echo "%~1\%%a") else (
- call :next "%~1\%%a"
- )
- )
复制代码
[ 本帖最后由 523066680 于 2010-1-18 12:03 编辑 ]
作者: vsbat 时间: 2010-1-18 12:02
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s /ad /b C:\^|findstr /e "\\update"') do (
- set "t=%%i"&set "t=!t:\update=+!"
- for /f "delims=+" %%j in ("!t!") do (
- set "_%%j=vsbat"
- )
- )
- for /f "tokens=1 delims=_=" %%h in ('set _') do echo %%h
- endlocal
- pause
复制代码
交卷----
吃饭去喽---
大家注意:万一 update 在根目录的情况
[ 本帖最后由 vsbat 于 2010-1-18 13:12 编辑 ]
作者: rwxyxy 时间: 2010-1-18 19:06
- @echo off&setlocal enabledelayedexpansion
- echo %cd%\ | findstr /I "nul'>\\update\\">nul && set yy=yy
- if defined yy (for /f "delims=" %%a in ('echo %cd%\ ^| findstr /I "\\update\\"') do (
- set str=%%a
- for /f "delims=*" %%b in ('echo !str:\update\^=*!') do echo %%b
- )) else (for /f "delims=" %%c in ('dir /ad /b /s^|findstr /I /E "update"') do (echo %%~dPc|findstr /I "\\update\\" >nul||echo %%~dPc))
- pause>nul
复制代码
现在可以在任何目录下执行,包括当前就在update目录下,或者在 *\update\*\update 目录下的情况测试通过;
[ 本帖最后由 rwxyxy 于 2010-1-19 18:34 编辑 ]
作者: vsbat 时间: 2010-1-18 20:51
回复楼上:
我的意思是 要做到可以包含这种情况
作者: batman 时间: 2010-1-18 21:05
用*通配符解决在根目录下的问题- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /ad /b /s *update') do (
- if /i "%%~na" equ "update" (
- set "str=%%a"&set "str=!str:update=/!"
- for /f "delims=/" %%a in ("!str!") do (
- if not defined _%%a echo %%a&set "_%%a=a"
- )
- )
- )
- pause>nul
复制代码
作者: zqz0012005 时间: 2010-1-19 13:01
- @echo off
- rem if /i "%cd:~-6%"=="update" echo %cd:~,-6%&pause&exit /b
- rem 用for对特殊字符的兼容性好一点(如&^)。当然如果不介意,可以加引号以避免
- for %%a in ("%cd%") do if /i "%%~nxa"=="update" echo %%~dpa&pause&exit /b
- 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
- pause
复制代码
作者: a590687 时间: 2010-1-19 14:41 标题: 看我的怎么样
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir/ad/s/b d:\^|findstr /e /i "update"') do (
- set "str=%%i"
- set "a=!str:update=update?!"
- for /f "delims=?" %%j in ("!a!") do (
- set "b=%%j"
- if not defined !b! (
- set !b!=000
- set "c=!b:~,-6!"
- echo !c! )
- )
- )
- pause
- ::把d:\改成你想搜索的路径就可以了
复制代码
[ 本帖最后由 a590687 于 2010-1-19 15:02 编辑 ]
作者: wxcute 时间: 2010-1-19 20:47 标题: 题目跟那个“保留关键字目录,删除其他目录”异曲同工。
我也来个:- @echo off
- setlocal enableDelayedExpansion
- set fd=%~dp0
- cd/d %fd%
- for /f "delims=" %%d in ('dir/s/ad/b update? 2^>nul')do (
- if exist %%~dpdupdate\ (
- set nd=%%d
- set nd=!nd:%fd%=!
- set nd=!nd:update=/!
- set nd=!nd:*/=!
- if "!nd!?"=="?" echo "%%~dpd"
- )
- )
- 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 |