簡體   English   中英

如何將文件從源目錄移動到具有文件名第一部分名稱的目標目錄?

[英]How to move files from a source directory to a destination directory with name of first part of file name?

在其他人的幫助下編寫了下面的批處理文件,但我沒有太多經驗,所以這對我來說有點困難。

我正在嘗試將 PDF 文件從特定位置傳輸到另一個位置的單個文件夾。 每個文件名都采用這種格式RANSOM-NH_2018-08-07_5485A635.pdf並且基於RANSOM-NH_批處理文件應將 PDF 文件傳輸/移動到名為RANSOM-NH_Ransom INC的正確文件夾中。 因此,根據文件名的開頭部分,應將文件移動到名稱以文件名開頭部分的文件夾中。

文件和文件夾名稱的一些示例:

文件名:

RANSOM-NH_2018-06-20_2018_5849.pdf
GREENWOOD_2018-07-02_66902.pdf
GLSCIENCES_2018-07-24_24811.pdf
CPI_2018-08-01_20039035.pdf
ALDR_2018-08-08_545477636.pdf
ACCQTRAX_2018-07-26_173845.pdf

文件夾名稱:

RANSOM-NH_Ransom INC
GREENWOOD_Greenwood Products, Inc
GLSCIENCES_GL Sciences, Inc
CPI_CPI International
ALDR_Sigma-Aldrich, Inc
ACCQTRAX_AccQtrax

我遇到的問題是編寫的腳本仍然將文件RANSOM-NH8_移動到它根本不應該執行的同一文件夾中。

@ECHO OFF
SETLOCAL
SET "sourcedir=C:\Users\Alpha\Documents\NOTEPAD Coding\File Transfer Coding\Files"
SET "destdir=C:\Users\Alpha\Documents\NOTEPAD Coding\File Transfer Coding\Transfer"
FOR /f "delims=" %%a IN ('dir /b /a-d "%sourcedir%\*.pdf" ') DO (
    FOR /f "tokens=1 delims=_-" %%b IN ("%%a") DO (
        FOR /f "delims=" %%d IN ('dir /b /ad "%destdir%\*%%b*" ') DO (
            MOVE "%sourcedir%\%%a" "%destdir%\%%d\"
        )
    )
)
GOTO :EOF

試試這個批處理文件代碼:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files"
set "DestDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer"

for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%\*_????-??-??_*.pdf" 2^>nul') do (
    for /F "eol=| tokens=1 delims=_" %%B in ("%%~nA") do (
        for /D %%C in ("%DestDir%\%%B_*") do move /Y "%SourceDir%\%%A" "%%C\"
    )
)

endlocal

第一個FOR在命令行后台以cmd.exe /C啟動的單獨命令進程中執行:

dir /B /A-D-H "C:\Users\Alpha\Documents\NOTEPAD Coding\File Transfer Coding\Files\*_????-??-??_*.pdf" 2>nul

DIR在指定目錄中搜​​索

  • 由於/ADH只是非隱藏文件(屬性不是目錄且未隱藏)
  • 匹配通配符模式*_????-??-??_*.pdf也可能只是*_*.pdf
  • 並輸出以裸格式處理STDOUT ,因為/B只是帶有文件擴展名的文件名,但沒有文件路徑。

如果指定的目錄根本不存在或沒有與該模式匹配的文件,則DIR輸出的用於處理STDERR的錯誤消息通過使用2>nul重定向到設備NUL來抑制。

閱讀有關使用命令重定向運算符的 Microsoft 文檔以了解2>nul的說明。 重定向運算符>必須在FOR命令行上使用脫字符^進行轉義,以便在 Windows 命令解釋器在執行命令FOR之前處理此命令行時解釋為文字字符,該命令使用在后台啟動的單獨命令進程執行嵌入式dir命令行。

FOR捕獲寫入已啟動命令進程的STDOUT的所有內容,並逐行處理捕獲的輸出。

FOR默認忽略所有空行(此處不出現)和所有以分號開頭的行。 文件名可以以分號開頭。 因此選項eol=| 用於將行尾字符重新定義為文件名不能包含的豎線,請參閱 Microsoft 文檔頁面Naming Files, Paths, and Namespaces

FOR還將使用空格/制表符作為分隔符將每一行拆分為子字符串(標記),並將僅將第一個空格/制表符分隔的字符串分配給指定的循環變量A 此處不需要這種拆分行為,因為文件名可以包含一個或多個空格字符。 因此,選項delims=用於定義一個空的分隔符列表,它完全禁用行拆分並導致將帶有擴展名的整個文件名分配給循環變量A

第二個FOR僅將文件名(不帶擴展名)處理為字符串。 這次文件名使用下划線作為分隔符進行拆分,因為delims=_僅將第一個下划線分隔的字符串分配給循環變量B因為tokens=1 好吧, tokens=1是使用for /F的默認值,因此可以從代碼中刪除此選項字符串。

因此,第一個FOR分配給A例如RANSOM-NH_2018-08-07_5485A635.pdf和第二個FOR處理RANSOM-NH_2018-08-07_5485A635並將字符串分配給B RANSOM-NH

帶有選項/D的第三個FOR在目標目錄中搜索非隱藏目錄,該目錄以分配給循環變量B的字符串和下划線開頭。 如果找到這樣的目錄,則將其帶有完整路徑的名稱分配給循環變量C並執行命令MOVE

該文件從源目錄移動到目標目錄中的現有子目錄,並覆蓋文件目標目錄中具有相同名稱的現有文件。

如果沒有以下划線開頭的 PDF 文件或在日期部分之前有多個下划線的 PDF 文件,則可以優化第二個FOR循環。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files"
set "DestDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer"

for /F "eol=| tokens=1* delims=_" %%A in ('dir /B /A-D-H "%SourceDir%\*_????-??-??_*.pdf" 2^>nul') do (
    for /D %%C in ("%DestDir%\%%A_*") do move /Y "%SourceDir%\%%A_%%B" "%%C\"
)

endlocal

選項tokens=1*導致根據ASCII 表將文件名的第一個下划線分隔部分分配給循環變量A ,並將文件名的其余部分分配給下一個循環變量B ,而無需進一步拆分下划線。

但請考慮到優化版本不適用於文件名,如

  • _RANSOM-X_2018-08-07_5485A635.pdf ...開頭的下划線,或
  • RANSOM-Y__2018-08-07_5485A635.pdf ... 超過一個下划線留下的日期部分。

優化后的版本可以進一步優化為單個命令行:

@for /F "eol=| tokens=1* delims=_" %%A in ('dir /B /A-D-H "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\*_????-??-??_*.pdf" 2^>nul') do @for /D %%C in ("%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer\%%A_*") do @move /Y "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\%%A_%%B" "%%C\"

好吧,未優化的版本也可以寫成更長的單命令行:

@for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\*_????-??-??_*.pdf" 2^>nul') do @for /F "eol=| tokens=1 delims=_" %%B in ("%%~nA") do @for /D %%C in ("%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer\%%B_*") do @move /Y "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\%%A" "%%C\"

要了解使用的命令及其工作原理,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀每個命令顯示的所有幫助頁面。

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • move /?
  • set /?
  • setlocal /?

暫無
暫無

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

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