2016-04-21 37 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

相關問題