簡單的方法是創建一個包含批處理文件的目錄 - 通用名稱爲batch
或belfry
,並在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.bat
,fred.cmd
,fred.exe
在每個.
(在被調用當前目錄)和%path%
(含有數據夾的分號分隔的列表)
您可以使用窗口改變路徑環境變量,但第三方實用工具,如path editor
(Google it)使其變得簡單。
所以 - 你需要做的是建立一個目錄來包含你的批處理文件中(你已經用mkdir
命令這樣做在你的貼批(雖然這是比較常見的使用md
這是mkdir
的同義詞))然後將批次移動到該目錄,並且無論當前目錄是在哪裏,都可以使用其基本名稱運行批處理。
實際上,我在那裏存儲的不止是批次 - 我將它用於我所有的實用程序.exe
s - 例如sed
。
分析你的代碼,
關閉@echo & SETLOCAL
的&
級聯的兩個命令。 @echo off
轉變命令回顯off
和setlocal
建立一個本地環境,確保在批處理結束時,環境的任何變化(變量創建或刪除等)都恢復到其原始狀態。請注意,這不會恢復添加/刪除/更改/移動的文件 - 只是環境變量。
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
命令以結束本地環境,因此您的代碼應該爲每個處理的文件創建和刪除本地環境。
所以,用move
由move
我主張替換時,變化將意味着用於移動的目的地爲[在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
報表。
是否有一個特定的原因,你爲什麼通過字符位置而不是'_'字符來分割文件名?在名稱中是否會出現多個'_'? – aschipfl