2017-06-22 89 views
0

一些上下文: 我從大約100張jpg格式的圖像命名爲AFSM-DDMMYY_doe-john.jpg,然後根據它們的名字將它們分類到文件夾中下面的腳本:如何使一個批處理文件循環通過子目錄

foldercreator.bat

@echo off &setlocal 
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
    set "filename1=%%~i" 
    setlocal enabledelayedexpansion 
    set "folder1=!filename1:~12,-4!" 
    mkdir "!folder1!" 2>nul 
    move "!filename1!" "!folder1!" >nul 
) 

我然後刪除的文件名,因此圖像在AFSM-DDMMYY.jpg此格式最終的_last-第一部分是使用下面的腳本進行:

nameremover.bat

@echo off &setlocal 
for /f "delims=" %%i in ('dir /b /a *.jpg') do (
    set "filename1=%%~i" 
    setlocal enabledelayedexpansion 
    set "name1=!filename1:~0,11!" 
    ren "!filename1!" "!name1!.jpg" 
) 

生成的文件夾最終被命名爲doe-john,其中包含AFSM-DDMMYY.jpg圖像。這些文件夾都位於通用文件夾中用於此目的。這很好,但我希望能夠從通用文件夾中運行nameremover.bat,以便它可以在所有doe-john文件夾中運行,而不必將其移動到每個文件夾,然後單獨運行它。先謝謝你。

+0

是否有一個特定的原因,你爲什麼通過字符位置而不是'_'字符來分割文件名?在名稱中是否會出現多個'_'? – aschipfl

回答

0

簡單的方法是創建一個包含批處理文件的目錄 - 通用名稱爲batchbelfry,並在path變量中包含該目錄名。這樣,目錄中的任何批處理文件都可以被執行,而不管你當前的目錄如何。

哦 - 順便說一句:你爲​​什麼不只是使用

move "!filename1!" "!folder1!\!filename1:~0,11!!filename1:~-4!" >nul 

在你的第一批?


當您指定可執行文件的路徑(例如c:\some\directory\executable.exe),那麼,這將是將要執行的文件。但是,如果您忽略該目錄並只執行executable.exe,則會嘗試在當前目錄中找到該文件。如果失敗,則檢查環境變量path,並運行path上找到的第一個匹配的可執行文件。

因此,如果您修改path包括一個目錄,如c:\batch那麼任何企圖運行可執行文件將運行它,如果executablename.exe出現在c:\batch目錄。

可執行文件有許多種,其中最重要的是.bat.cmd.exe並且可以使用其基地的名字,所以執行fred將定位fred.batfred.cmdfred.exe在每個.(在被調用當前目錄)和%path%(含有數據夾的分號分隔的列表)

可以使用窗口改變路徑環境變量,但第三方實用工具,如path editor(Google it)使其變得簡單。

所以 - 你需要做的是建立一個目錄來包含你的批處理文件中(你已經用mkdir命令這樣做在你的貼批(雖然這是比較常見的使用md這是mkdir的同義詞))然後將批次移動到該目錄,並且無論當前目錄是在哪裏,都可以使用其基本名稱運行批處理。

實際上,我在那裏存儲的不止是批次 - 我將它用於我所有的實用程序.exe s - 例如sed

分析你的代碼,

關閉@echo & SETLOCAL

&級聯的兩個命令。 @echo off轉變命令回顯offsetlocal建立一個本地環境,確保在批處理結束時,環境的任何變化(變量創建或刪除等)都恢復到其原始狀態。請注意,這不會恢復添加/刪除/更改/移動的文件 - 只是環境變量。

FOR/F 「delims =」 %%我在( 'DIR/B /廣告* .JPG')做(

執行dir命令來查找所有.jpg文件;只有名字沒有目錄名,將這個名單到內存中,如果它是一個文件。「閱讀」列表,一行一行地各行的內容依次分配給%%i

集「文件名1 = %%〜我「

將環境變量filename1設置爲%%i的內容= dir行的內容。

SETLOCAL enabledelayedexpansion

NEST一個新的本地環境,但是這其中有delayedexpansion調用,這樣!var!意爲「var%var%當前值的意思是」 var的價值,因爲它是當for **遇到**

設置「folder1 =!filename1:〜12,-4!」

設置folder1到的filename1當前值,從第13個字符(從「字符0」開始計數),以從端部的第四字符。

mkdir「!folder1!「2> NUL

作出這樣的目錄,抑制和錯誤信息(如 '它已經存在')

招 」!文件名1!「! 」文件夾1!「> NUL

的文件移動到新的目錄。由於"folder1!" is a directory, the file will be moved into that directory. If it didn't exist, the移動would move the file to a **file** named! 「文件夾1」!`

code block

...和結束do幾行前開始後,由(

注意

setlocal建立嵌套當地的環境。這些是有限的。您應該在move命令之後放置一個endlocal命令以結束本地環境,因此您的代碼應該爲每個處理的文件創建和刪除本地環境。

所以,用movemove我主張替換時,變化將意味着用於移動的目的地爲[在folder1目標目錄\的filename1 +最後4個字符的前12個字符從filename1]

這將避免nameremover過程。

督察,

@echo off &setlocal 
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
    set "filename1=%%~i" 
    setlocal enabledelayedexpansion 
    set "folder1=!filename1:~12,-4!" 
    mkdir "!folder1!" 2>nul 
    move "!filename1!" "!folder1!\!filename1:~0,11!!filename1:~-4!" >nul 
    ENDLOCAL 
) 

應該做的處理,而不需要做 'nameremover' 一步。在更改path後,將其置於\batch目錄中,並且無論您身在系統中的哪個位置(包括您是否登錄到其他驅動器),都應該能夠直接從提示符運行代碼。


要建立一個菜單,常規的做法是:

:again 
cls 
echo 1. do thing 1 
echo 2. do thing 2 
echo 3. do thing 3 
echo q quit 
choice /c 123q /m please choose... 
if errorlevel 4 goto :eof 
if errorlevel 3 call batch3&goto again 
if errorlevel 2 call batch2&goto again 
if errorlevel 1 call batch1&goto again 
goto again 

choice /?在提示符下會產生如何choice工作的指南。

errorlevel根據激活密鑰的字符串中的字符位置設置。

由於if errorlevel n爲真,如果errorlevel爲n 或大於n的 代碼必須以相反的值的順序來構成。

要執行的代碼可能會改變errorlevel的值。 因此,在執行子公司 批次之後需要goto,以確保從batch3返回,比如說不被 解釋爲剩餘的if errorlevel報表。

+0

嘿,謝謝你的回覆。我之所以沒有使用它,是因爲我以前從未使用過批處理文件,但是這個特定的項目需要它,所以我真的只是從我在互聯網上找不到的東西開始,讓它適合我的需求。你能否更詳細地解釋我將如何實現一個目錄以及我的第一批文件和你建議的更改有什麼不同?謝謝。 – Frazier

+0

剛到家,能夠嘗試一下。完美的作品,我很感激你花時間向我解釋你是如何做到的,所以我現在明白它更好。非常感激。 – Frazier

+0

所以你似乎對批處理文件的方式非常瞭解,所以我想知道你是否可以進一步幫助我。你給我的腳本令人驚歎,我非常感謝。我遇到的一件事是,我有很多不同類型的文件名,我經常生成。我已經編輯了你爲這些情況所做的批處理文件,現在有一堆批處理文件。我想知道是否有可能使它在運行腳本時打開cmd窗口,並詢問在同一批處理文件中運行哪個版本。 – Frazier

相關問題