2015-02-07 176 views
1

我想創建基於文件名看起來像這樣的文件夾中創建的文件夾:Windows批處理基於文件名

file with words 01.wav 
file with words 02.wav 
file with words 03.wav 
file with more words 01.wav 
file with more words 02.wav 
... 

樹看起來應該是這樣

Folder 
|----file with words 
    |----file with words 01.wav 
    |----file with words 02.wav 
    |----file with words 03.wav 
|----file with more words 
    |----file with more words 01.wav 
    |----file with more words 02.wav 

和內宜文件保留原來的名字 如何在每個數字之前解決最後一個空格? 我無法爲「標記」指定一個固定值,因爲最後一個空格的位置因文件而異。 這是我的方法:

FOR /f "tokens=1*" %%a IN (
'dir /b /a-d "* *.wav"' 
) DO (
ECHO MD %%a 
ECHO MOVE "%%a %%b" .\%%a\ 
) 
PAUSE 

- >ECHO調試結果

回答

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir\t w o" 
PUSHD "%sourcedir%" 
FOR /f "delims=" %%a IN (
    'dir /b /a-d *.wav ' 
) DO (
SET "filename=%%a" 
SET "dirname=%%a" 
CALL :genmove 
) 
popd 

GOTO :EOF 

:genmove 
IF "%dirname:~-1%" neq " " set "dirname=%dirname:~0,-1%"&goto genmove 
set "dirname=%dirname:~0,-1%" 
ECHO(MD "%dirname%" 
ECHO(MOVE "%filename%" ".\%dirname%\" 
GOTO :eof 

你需要改變的sourcedir設置,以滿足您的具體情況。

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

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

簡單地生成的文件和目錄相同的名稱,從名稱剪掉的最後一個字符,直到該字符是一個空格,修剪其關閉,你有需要的目錄名稱和文件名。

+0

太棒了!!!這正是我需要的 – 2015-02-07 15:58:38

2
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for %%a in (*.wav) do (
     set "filename=%%~na" 
     setlocal enabledelayedexpansion 
     for %%b in ("::\!filename: =\!\..") do (endlocal & set "filename=%%~pnxb") 
     setlocal enabledelayedexpansion 
     for /f "tokens=*" %%b in ("!filename:\= !") do ( 
      endlocal 
      if not exist "%%b\" md "%%b" 
      if exist "%%b*.wav" move /y "%%b *.wav" "%%b" 
     ) 
    ) 

的代碼背後的想法是遍歷文件的列表,併爲每一個,在它的名稱空間是用反斜槓(file\with\words\01)所取代,所以我們可以使用for替換參數查詢「父文件夾「的最後一個元素(沒有結尾數字的名稱),然後用空格替換反斜槓以獲得最終的文件夾名稱。

包含多個setlocal/endlocal是爲了處理可能包含感嘆號(啓用延遲擴展時出現問題的字符)的文件名的情況。

代碼嘗試只用一個move命令移動每個集合中的所有匹配文件,但取決於實名,可能來自其他集合的文件也可能匹配。爲了避免它,線

if exist "%%b*.wav" move /y "%%b *.wav" "%%b" 

應該被轉換爲

move /y "%%a" "%%b\" 

所以文件被移動逐個沒有問題。

0

這是一個使用JREPL.BAT的版本 - 執行正則表達式文本替換的混合JScript /批處理實用程序。

此解決方案的優點是,它只會嘗試移動名稱與{baseName} {空格} {數字} {數字}匹配的.wav文件,如果它無法創建{baseName}文件夾,它將不會移動文件因爲文件{baseName}已經存在。這些功能可以添加到已發佈的純批處理解決方案中。但是,我發現通過JREPL.BAT構建強大的解決方案更爲簡單。

@echo off 
for /f "tokens=1,2 delims=:" %%A in (
    'dir /b "* ??.wmv" ^| jrepl "(.+?) +\d\d\.wmv$" "$1+':'+$0" /i /jmatch' 
) do (
    if not exist "%%A\" if not exist "%%A" (
    md "%%A" 
) else echo Can't create folder "%%A" because a file exists with that name 
    if exist "%%A\" move "%%B" "%%A" >nul 
)