簡體   English   中英

Windows Batch根據文件名創建文件夾

[英]Windows Batch create folders based on file names

我想基於如下文件名創建文件夾:

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調試結果

@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命令move每個集中的所有匹配文件,但是根據真實名稱,其他集中的文件也可能會匹配。 為了避免它,行

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

應該轉換成

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

這樣一來,文件就不會出現任何問題。

@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即可實際移動文件。Append >nul可禁止報告消息(例如,已1 file moved

只需為文件和目錄生成相同的名稱,將名稱中的最后一個字符剪掉,直到該字符成為空格為止,然后將其剪掉,便有了所需的目錄名和文件名。

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

此解決方案的優勢在於,它僅嘗試移動名稱與{baseName} {space} {digit} {digit}匹配的.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
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM