2014-09-18 80 views
0

我有一個包含一堆子文件夾和文件的文件夾,但結構有點低效。例如:命令行將目錄樹中的文件/文件夾向上移動

根文件夾
---- EmptyFolder1
-------- Folder1中
------------ SubFolder1
------ ------文件1
------------文件2
---- EmptyFolder2
-------- FOLDER2
-------- ---- SubFolder2
------------ File3
------------ File4

我怎樣才能把所有的文件夾/子文件夾/文件爬在樹上,並消除所有的EmptyFolders,使其看起來更像是這樣的:

根文件夾
---- Folder1中
- ------ SubFolder1
--------文件1
--------文件2
----文件夾2
-------- SubFolder2
- -------文件3
--------文件4

+0

如果他們都跟着EmptyFolderX與子文件夾Folder1,你不能,因爲你只能在一個目錄中有一個名爲Folder1的文件夾,並且將它們全部移到一個級別會導致倍數。你可以說得更詳細點嗎? – 2014-09-18 20:36:41

+0

@KenWhite,標記爲「Folder1」的確具有唯一的名稱。 – 2014-09-18 20:38:15

+0

然後請[編輯]你的問題,並指出這一事實。正如所寫的,這方面的問題並不清楚。(我不確定爲什麼你需要一個批處理文件來做到這一點,順便說一句,它應該是一次性操作,除非你有成千上萬個「EmptyFolderX」項目,否則只需拖動/ drop在Windows資源管理器中完成此操作。) – 2014-09-18 20:39:58

回答

1
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir\t h r e e" 

FOR /f "delims=" %%a IN (
'dir/s/b/a-d "%sourcedir%"' 
) DO (
CALL :movefile %%a 
) 

:loop 
SET "zapped=" 
FOR /d /r "%sourcedir%" %%a IN (.) DO (
RD "%%a" >NUL 2>NUL 
IF NOT EXIST "%%a" SET zapped=Y 
) 
IF DEFINED zapped GOTO loop 
DIR /s/b/ad "%sourcedir% 

GOTO :EOF 

:movefile 
SET "oldfn=%*" 
SET "newfn=!oldfn:%sourcedir%\=!" 
SET "newfn=%sourcedir%\%newfn:*\=%" 
FOR %%r IN ("%newfn%") DO (
ECHO MD "%%~dpr" 
ECHO MOVE "%oldfn%" "%newfn%" 
) 

GOTO :eof 

您需要更改sourcedir的設置以適合您的情況。

警告首先對代表性子樹進行測試!

爲了測試目的,所需的MD命令僅僅是ECHO驗證命令是否正確後,將ECHO(MD更改爲MD以實際創建目錄。附加2>nul以抑制錯誤消息(例如,當目錄已經存在時)

爲了測試目的,所需的MOVE命令僅僅是ECHO確認命令正確後,將ECHO(MOVE更改爲MOVE以實際移動文件。追加>nul以取消報告消息(例如,1 file moved

:loop標籤後的部分刪除子樹中的所有空目錄。必要時,不僅僅顯示命令執行

對包含對cmd有特殊含義的符號的文件/目錄名稱要非常小心。

相關問題