2016-04-21 49 views
3

UPDATE如何在文本文件中逐步“cd”进入所有文件夹?

这里是我的全码:

cd "C:\Users" 

DIR /A:D /S /B > "%appdata%\folder_overview.txt" 

type "%appdata%\folder_overview.txt" | findstr /v AppData | findstr /v All.Users | findstr /v Public >> "%appdata%\newfolder.txt" 
move "%appdata%\newfolder.txt" "%appdata%\folder_overview.txt" 

:repeatuntilfilesizezero 
set LINES=0 
for /f "delims==" %%I in (%appdata%\folder_overview.txt) do (
    set /a LINES=LINES+1 
) 

set /a LINES=LINES-1 
more +%LINES% < "%appdata%\folder_overview.txt" >> "%appdata%\last_folder.txt" 

Setlocal EnableDelayedExpansion 
set content= 
for /f "delims=" %%i in (%appdata%\last_folder.txt) do set content=!content! %%i 

pause 

cd %content% 

type "%appdata%\folder_overview.txt" | findstr /v "%content%" >> "%appdata%\newfolder.txt" 
move "%appdata%\newfolder.txt" "%appdata%\folder_overview.txt" 

DEL "%appdata%\last_folder.txt" 

FOR %%S IN (%appdata%\folder_overview.txt) DO set size=%%~zS 

echo %size% 
IF %size% gtr 0 echo goto :repeatuntilfilesizezero 
IF %size% equ 0 echo "null" 

pause 

我注意到,这是完全值得,最后一行是空行。 我只想以下几点:

  • 列表中的所有文件夹
  • “cd”命令在“folder_overview.txt”最后一个文件夹,并从文件中删除最后一行
  • 检查,如果“folder_overview.txt”空 - >如果不是空的,只是转到标签“:repeatuntilfilesizezero” - >如果为空,转到退出

所以最后“CD”,其中的所有文件夹中一步一步“folder_overview.txt ”。

目前“goto:repeatuntilfilesizezero”不起作用。它不会跳转到标签。

Hannir

+0

你想要最后一个非空行吗? – Stephan

+1

为什么要计数?只需在'folder_overview.txt'中用'for/F %% L'循环'set'LINE = %% L“'在它的主体中,所以'LINE'被每次迭代覆盖并且最后包含最后一行(记住'for/F'自己跳空行)......如果'folder_overview.txt'不包含重复行,则可以使用'findstr/L/V/X/C'来删除最后一行... – aschipfl

+0

对于命令'set content =%content %%%我'你需要启用延迟扩展,因为它在一个循环中,所以它必须读'set content =!content! %%我'... – aschipfl

回答

1

我无法检测你想做的事,但你cd到每一个目录中,我假设你想要做的事每个文件夹中在树中:

@echo off 
cd /d "c:\users" 
for /f %%i in (' dir /s /b /ad ^|findstr /v "AppData All.Users Public" ') do (
    pushd "%%i" 
    echo now working in: %%i 
    echo doing something here in %%~ni 
    popd 
) 
+0

是否可以跳过一些文件夹?我想跳过“findstr/v AppData | findstr/v All.Users | findstr/v Public”文件夹。顺便说一句好话 - 这就是我一直在寻找的。 – hannir

+0

不是一件大事。看我的编辑。 – Stephan

+0

我真的很感谢你的代码!非常感谢@Stephan! – hannir

2

要检索的文本文件的非空的最后一行,则不需要计数线,并跳过所有,但一个与more。只需使用一个for /F循环与变量赋值相反,所以变量保存最后一行终于:

> "%APPDATA%\last_folder.txt" (
    for /F usebackq^ delims^=^ eol^= %%L in ("%APPDATA%\folder_overview.txt") do (
     set "LINE=%%L" 
    ) 
    setlocal EnableDelayedExpansion 
    echo(!LINE! 
    endlocal 
) 

延迟变量扩展在这里用来避免与一些特殊的字符,如在^&()麻烦最后一行。


如果文件不包含重复的行,下面的代码可以用来去除最后一行:

> "%APPDATA%\folder_overwiew.txt" findstr /L /X /V /G:"%APPDATA%\last_folder.txt" "%APPDATA%\folder_overwiew.txt" 

如果文件中可能包含重复的,可以使用下面的代码片段而不是:

set "LINE=" 
> "%APPDATA%\folder_overwiew.txt" (
    for /F usebackq^ delims^=^ eol^= %%L in ("%APPDATA%\folder_overview.txt") do (
     setlocal EnableDelayedExpansion 
     if defined LINE echo(!LINE! 
     endlocal 
     set "LINE=%%L" 
    ) 
) 
+0

如果'DIR/A:D/S/B'给出重复项,你有麻烦了,我想:D – Stephan

+0

是的,@Stephan,当然;但只是一般的任何文本文件... – aschipfl

+0

非常感谢@aschipfl:] – hannir

相关问题