2016-11-18 21 views
0

我堅持一個想法,我只是不能離開地面,這是因爲我不明白FOR循環非常好。瞭解批/ D循環複製

本質上,我試圖做的是一個FOR循環,它將通過它的當前目錄和每個7個隨機數字的文件夾長,它將移動另一個文件到該目錄並調用它。我會在這裏畫一個圖。

  • %CD%
    • \ 1234567 \
    • \ 2345671 \
    • \ 3456712 \
    • \發佈\
    • filetomove.bat

所以他的目的是要移動的文件只會在編號的目錄中結束。

  • %CD%
    • \ 1234567 \ filetomove.bat
    • \ 2345671 \ filetomove.bat
    • \ 3456712 \ filetomove.bat
    • \發佈\
    • filetomove.bat

然後,一旦它在這些目錄中,它會在每個目錄中調用蝙蝠。

  • %CD%
    • CALL \ 1234567 \ filetomove.bat
    • CALL \ 2345671 \ filetomove.bat
    • CALL \ 3456712 \ filetomove.bat
    • \發佈\
    • filetomove.bat

如果某些文件存在或不存在,但我希望能夠先下移文件,那麼我會用IF語句使其更加複雜,以僅移動某個.bat文件。我想我可能會在IF聲明中表現出色。

有沒有人知道我想做什麼讓這成爲可能?我認爲我可以做的文件目錄像

FOR /D %%G in ("%cd%\[0-9][0-9][0-9][0-9][0-9][0-9][0-9]\") DO COPY... 

但顯然這樣的東西不按我打算的方式工作。我其實可以看到,是查找每個文件的唯一方法是做這樣的事情......

FOR /D %%G in ("%cd%\*") DO ECHO %%G 

,並讓代碼返回給我的目錄字符串。我做錯了什麼,只是不知道,或者只是不理解?

+0

Windows命令行不會執行正則表達式,因此'[0-9]'是一個禁止行爲。你需要使用'findstr',它理解正則表達式。 – LinuxDisciple

+0

這會走向正確的方向嗎? 'FOR/D %% G in(findstr ...)DO COPY ...' – Sero

+0

這裏有很多缺陷。看看答案。我會添加它來解釋最奇怪的部分。 – LinuxDisciple

回答

1

我無法理解您的整個想法,但以下是如何遍歷所有具有7位數字名稱的文件夾,然後運行批處理相當於處理輸出的函數。請注意,要使用%%變量語法,需要從批處理文件中運行。命令行在迭代器變量前僅使用一個%

for /f "tokens=*" %%a in ('dir /b /aD * ^|findstr /R "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"') do call :junk "%%a" 
REM stuff here runs after the for loop finishes 

REM the goto :EOF here makes sure we aren't going to accidentally run :junk again when we didn't mean to. 
goto :EOF 
:junk 
REM This runs each time 'for' spits out a new directory name. 
set yourDirName=%~1 
REM do other stuff here with this dir name, like copying or whatever. 

REM If for instance you wanted to run a batch file c:\mybatfile.bat in 
REM each dir, you could do that here: 
pushd "%yourDirName%" 
REM Now you're in the %yourDirName% directory and you can run your command: 
c:\mybatfile.bat 
popd 
REM popd is the opposite of pushd. 
goto :EOF 

下面是在腳本中使用的一些語法的解釋。

for /f可以解析命令輸出。這就是爲什麼它總是我最喜歡的。

"tokens=*"導致for循環的該迭代的輸出全部結束於一個變量(%%a)。否則,您將獲得%% a中的第一個分隔標記,%% b中的下一個標記等。

單引號您的命令。我這樣做是因爲它有效,不是因爲我知道爲什麼。

對於dir/b刪除您不需要的信息的列,只是給出了名稱。 /aD爲您提供了有D irectory /a ttribute

文件你需要躲避|字符用^當它是你給到for

使用findstr /R這樣你就可以過濾名稱的命令的一部分基於正則表達式。

call允許您跳轉到一個命令塊並將參數傳遞到該塊(如%1,%2等),以便您可以執行一組命令,而不必將它們塞進一組括號中那給你奇怪的評估行爲。

當您使用call時,就像運行另一個腳本,恰好是您當前腳本的一部分。要從該「其他腳本」的執行上下文返回,請使用goto :EOF。它與exit不同,因爲它不會完全終止您的程序;它只是在元標籤:EOF上執行goto,這是文件結束的縮寫。在這裏,我們希望腳本的行爲好像已經用盡了命令(如果有的話會繼續執行更高的上下文),而不是使用exit直接退出命令行。 這裏的流量爲:

開始在for循環

對於for每次循環:

call :junk

執行所有的命令:junk下,直到我們打goto :EOF

goto :EOF:junk的底部導致執行控制爲返回到for循環,以便它可以再次迭代。

for用完數據以迭代時,它會嘗試執行更多的腳本行。我們不希望它再次執行:junk,所以有一個goto :EOF以上:junk

很簡單吧?

+0

非常複雜,我花了很長時間纔得到它。讓我嘗試使用提供的內容。雖然問題,我注意到GOTO:EOF。第一個只是停止FOR循環,然後第二個停止執行其餘的命令? – Sero

+0

它與:呼叫。爲了避免將解釋陷入評論,我會添加答案。 – LinuxDisciple