批次腳本可根據第一個單字將多個 PDF 檔案移動到同一目錄中也具有相同第一個單字的資料夾

批次腳本可根據第一個單字將多個 PDF 檔案移動到同一目錄中也具有相同第一個單字的資料夾

我有大量檔案儲存在一個目錄中,我希望根據檔案名稱中的第一個世界將它們分類到子資料夾中。

因此,我有數千個 .pdf 文件,它們都有不同的第一個單字(7 個數字字元)。

我還有數千個資料夾,它們在同一目錄中具有不同的第一個單字 7 個數字字元。

我正在嘗試將所有 .pdf 移動到具有相同第一個單字(7 個字元)的資料夾中。

因此,我需要一個批次文件,該文件本質上檢查pdf 文件並檢查同一目錄,以查看是否已存在具有相同前7 個數字字元的資料夾,以及是否確實將.pdf 移至該資料夾中。

如果 .pdf 的資料夾不存在,它將根據 .pdf 檔案的前七個字元建立一個資料夾。

例如,我在同一目錄中有一個名為「1617832_XXXXXXXX_XXX.pdf」的pdf和一個名為「1617832_XXXXXXXX」的資料夾,我希望將「1617832_XXXXXXXX_***.pdf」移到現有資料夾「1617832_XXXXXXXX」中。但是,如果資料夾「1617832_XXXXXXXX」不存在,我希望建立一個標題為「1617832」(檔案的前七個字元)的資料夾。

之後,它將轉到下一個.pdf“4530834__XXXXXXXX_XXX.pdf”,並檢查資料夾以查看是否有具有相同第一個單字(七個字元)的匹配資料夾,然後將檔案移至該資料夾中(如果它存在,否則會建立一個新資料夾)。

唯一接近但運行時間太長且不會建立資料夾(如果資料夾不存在)的是:

@echo on
setlocal enabledelayedexpansion
cls

pushd c:\folders\

for /f "tokens=*" %%1 in ('dir /a-d /b *') do (
set filename=%%1&set dirname=!filename:~0,7!

for /f "tokens=*" %%A in ('dir /ad /b') do (
    set dirid=%%A&set dirid=!dirid:~0,7!

if "!dirid!" equ "!dirname!" move %%1 %%A
  )        
)

有什麼辦法可以更有效率、更有效地做到這一點?

答案1

測試一下:

@echo off
setlocal EnableDelayedExpansion

REM Put here the path where the PDFs are:
set "Source=%userprofile%\Desktop\test"

for %%a in ("%Source%\*.PDF") do (
set "File=%%~na"
for /d %%b in ("%Source%\*") do (
set "Folder=%%~nb"
If "!File:~0,7!"=="!Folder:~0,7!" Move "%%a" "%%b"
)
if Exist "%%a" md "!Source!\!File:~0,7!"& move /y "%%a" "!Source!\!File:~0,7!"
)

在此輸入影像描述

答案2

  • 更新考慮到這個評論:是的,如果兩個資料夾與前 7 個字元匹配,我希望將檔案移至具有相同前 7 個字元的兩個資料夾

您不能使用 move 命令,因為移動後將無法將其(移動的檔案)複製到前 7 個字元匹配的另一個資料夾中。


@echo off && setlocal enabledelayedexpansion 

cd /d "O:\Path\Operations\Blank\Blanky\Blank Blank" && cls 

for /f tokens^=* %%i in ('dir /a:d .\* /b ')do set "_folder=%%~ni" && if exist ".\%%~ni*.pdf" (
for /f tokens^=* %%F in ('dir /a:d /b ".\!_folder:~0,7!*"')do copy ".\%%~ni*.pdf" "%%~dpnF\." )

for %%F in (*.pdf)do set "_file=%%~nF" && call set "_file=!_file:~0,7!" && (
if not exist .\!_file!\. md .\!_file!\ && copy /y "%%~dpnxF" ".\!_file!\." )

:: Deleting these files was copied to multiple folders instead of being moved to folder...
(echo/ if exist .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF

首先處理資料夾,看看是否有文件匹配;之後,檢查資料夾中的剩餘檔案並且沒有目的地


如果所有檔案都已複製到相應的資料夾中,則需要刪除此:只需刪除echo /命令:


迴聲/如果存在 .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && 前往 :EOF

相關內容