我希望根據開始時的文本(作者姓名)遷移大量檔案(電子書) 我已經嘗試撰寫批處理檔案,但我缺少一些基本的東西。
幾乎所有的檔案都是
"Authors name - Book title.extention"
"Authors name - [Book series] - Book title.extention"
我希望通過標識作者姓名部分的腳本(最好是批處理檔案)傳遞每個檔案(基本上查找第一個“-”,然后根據起始修剪字串創建一個目錄。
我根據研究制定了一個 FOR & IF 命令,但其中一部分不起作用
SET str=%1%
FOR /L %%a in (1,1,50) do (
if "!str:~%%a,3!"==" - " (
set DName=!str:~0,%%a-1!
MD DName
MOVE %1 DName
EXIT
)
)
我不完全理解字串截斷命令“STRING:~STARTING POSITIONWITHINSTRING,STRINGLENGTH”。我一直在尋找人們使用它的例子,就像它正常作業一樣,但我找不到解釋它如何運作的檔案。
我要問的可以作為 BATCH 檔案完成嗎?我究竟做錯了什么?
uj5u.com熱心網友回復:
使用一個小技巧來擺脫分隔符字串和標題(注意:它不適用于推薦的語法set "var=value",因此請格外小心,不要在set folder...命令中添加任何空格)
@echo off
setlocal
set "file=%~1"
SET "file=Authors name - Book title.extention"
set folder=%file: - =&REM %
ECHO md "%folder%" 2>nul
ECHO move "%file%" "%folder%\"
洗掉該SET行(僅用于演示)和(在驗證它按預期作業后),這兩個ECHO命令。
即使作者姓名包含-,也可以作業,就像Karl-Heinz Writer因為它被一個字串分割<space><dash><space>,這for是無法做到的。
uj5u.com熱心網友回復:
該任務可以使用帶有以下代碼的批處理檔案來完成:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir "* - *" /A-D /B 2^>nul') do for /F "eol=| delims=-" %%J in ("%%I") do (
if not exist "%%~nxJ" md "%%~nxJ"
if exist "%%~nxJ" move "%%I" "%%~nxJ\"
)
endlocal
命令DIR搜索
- 在當前目錄
- 僅用于檔案,因為選項
/A-D(屬性不是目錄) - 其中檔案名與通配符模式匹配
* - * - 并以裸格式輸出找到的檔案名,因為 option
/B這意味著只有檔案名和擴展名,沒有路徑。
可能找不到與條件匹配的檔案名,這將導致寫入處理STDERR的錯誤訊息。通過將其重定向到設備NUL來抑制此可能的錯誤訊息。
閱讀關于微軟的檔案使用命令重定向運算子的的解釋2>nul。當 Windows 命令解釋器在執行命令FOR之前處理此命令列時,重定向運算子>必須^在FOR命令列上用脫字符符轉義為文字字符,FORdir在后臺啟動的單獨命令列程中執行嵌入cmd.exe /c的命令列內'所附作為附加引數。
后臺命令程序中DIR的輸出被FOR捕獲并逐行處理。
FOR使用選項會/F跳過此處根本不出現的空行。FOR處理捕獲的行的默認行為是使用普通空格和水平制表符作為字串分隔符將行拆分為子字串,并僅將第一個空格/制表符分隔的字串分配給指定的回圈變數I。DIR輸出的檔案名不需要這種行拆分行為,因為檔案名肯定包含空格,并且進一步處理檔案需要整個檔案名。因此,該選項delims=用于定義字串分隔符的空串列以關閉行拆分行為,從而獲取分配給回圈變數的帶有擴展名的檔案名I。
FOR on using 選項/F也會查看第一個子字串的第一個字符,如果它以分號開頭,則該行將忽略進一步處理,分號是默認的行尾字符。作者姓名不太可能以 開頭;,但仍然使用了選項eol=|來重新定義行尾字符,并帶有豎線,檔案名永遠不能包含該豎線。
第二個for /F用于使用-字串分隔符拆分檔案名字串,并僅獲取分配給指定回圈變數的第一個子字串J。只要作者姓名不包含-在內,這對您的檔案名有效。SoJ在每個檔案名上定義,Authors name 連字符的空格作為尾隨空格。
有關命名檔案、路徑和命名空間的 Microsoft 檔案解釋了 Windows 如何通過洗掉尾隨空格/點來處理檔案/檔案夾名稱。出于這個原因%%~nxJ,用于參考字串直到第一個-,根據作者姓名是否已經存在,獨立于子目錄洗掉尾隨空格和點。
第一個IF條件用于檢查根據作者姓名的子目錄是否不存在,在這種情況下,使用命令MD創建子目錄以創建目錄。
第二個IF條件用于驗證根據作者姓名的子目錄現在是否存在,如果是預期的情況,則使用命令MOVE將檔案移動到子目錄中。
上面的一個變體是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir "* - *" /A-D /B 2^>nul') do for /F "eol=| tokens=1* delims=-" %%J in ("%%I") do (
if not exist "%%~nxJ" md "%%~nxJ"
if exist "%%~nxJ" for /F "eol=| tokens=*" %%L in ("%%K") do move "%%I" "%%~nxJ\%%L"
)
endlocal
不同之處在于,每個檔案都被移動到具有新名稱的子目錄中,直到第一個連字符為止的所有內容和第一個連字符之后的所有空格都從檔案名中洗掉,以使子目錄中的檔案在檔案名中沒有作者姓名。
使用命令列而不使用環境變數和延遲變數擴展的主要優點是此代碼也適用于包含一個或多個感嘆號的檔案名。
要了解使用的命令及其作業原理,請打開命令提示符視窗,在那里執行以下命令,并仔細閱讀為每個命令顯示的所有幫助頁面。
dir /?echo /?endlocal /?for /?if /?md /?move /?setlocal /?
uj5u.com熱心網友回復:
這是使用多個字符作為分隔符來拆分字串的另一種方法。這使用了在執行代碼行之前如何擴展變數值的一些非常獨特的方面。
SET "var=Authors name - Book title.extention"
set "Author=%var: - =" & set "Book=%"
Echo Author=%Author%
echo Book=%Book%
這會給輸出。
Author=Authors name
Book=Book title.extention
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362209.html
標籤:批处理文件
