[英]Windows batch file copying/renaming files
我一直在創建一個批處理文件,該文件將文件從一個目錄移動到另一個目錄,如果文件名已經存在,則將其重命名,然后將其移動。
我真的是新創建批處理文件,所以到目前為止
set temp=C:\Users\Daniel\Desktop\a\a1
set dir=C:\Users\Daniel\Desktop\a\
set /a "counter=0"
set "duplicate=-copy^("
set "bracket=^)"
if exist "%temp%" ( ^
for %%i in (%temp%\*) ^
do ^
if exist "%dir%\%%~ni%%~xi" ( call :checkFileName %%~ni %%~xi) ^
ELSE ( move %temp%\%%~ni%%~xi %dir% ) )^
ELSE ( echo doesnt exist)
:checkFileName
echo test
set fileName=%1
set fileExtenstion=%2
set /a "counter+=1
rem Do whatever you want here over the files of this subdir, for example:
if exist %dir%%fileName%%duplicate%%counter%%bracket%%fileExtenstion% ( IF defined %1 (
IF defined %2 (call :checkFileName %1 %2 )) ) ELSE (ren %temp%\%fileName%%fileExtenstion% %fileName%%duplicate%%counter%%bracket%%fileExtenstion% )
timeout 30
goto :eof
:increment
set /a "counter+=1"
goto :eof
我不知道在調用我的checkFileName函數之前增加var。 我認為遞歸調用相同的函數是正確的主意,但是我對命令/語法有點不滿意,因為我僅在星期五開始這樣做。
任何建議或指示,將不勝感激。 (如果您知道任何值得一看的有用鏈接/書,請告訴我!)
超時600
@ECHO OFF
SETLOCAL
set "tempdir=C:\Users\Daniel\Desktop\a\a1"
set "dir=C:\Users\Daniel\Desktop\a"
set "tempdir=U:\sourcedir\t w o"
set "dir=U:\destdir"
set "duplicate=-copy("
set "bracket=)"
if exist "%tempdir%" (
for %%i in ("%tempdir%\*") do (
if exist "%dir%\%%~nxi" ( call :checkFileName "%%~ni" "%%~xi"
) ELSE (
move "%tempdir%\%%~nxi" "%dir%" >nul
)
)
) ELSE (
echo doesnt EXIST
)
GOTO :eof
:checkFileName
set "fileName=%~1"
set "fileExtenstion=%~2"
set /a counter=0
:nexttry
set /a counter+=1
rem Do whatever you want here over the files of this subdir, for example:
if exist "%dir%\%fileName%%duplicate%%counter%%bracket%%fileExtenstion%" GOTO nexttry
move "%tempdir%\%fileName%%fileExtenstion%" "%dir%\%fileName%%duplicate%%counter%%bracket%%fileExtenstion%" >nul
goto :eof
這是修訂版。 我將解釋所做的更改:
@echo off關閉命令回顯
setlocal確保在過程結束時撤消對環境所做的任何更改。
我添加了額外的sets
來重新設置目錄以適合我的系統。 您需要刪除這兩行。
temp是一個特殊名稱,它指向一個臨時目錄。 相當多的之一。 最好不要使用該特定名稱-替換為tempdir
當用於數字集並不需要引號設置 。 在字符串集中,語法set "var=value"
用於確保命令行中的尾隨空格不包括在分配的值中(這可能會導致混亂-空格有點-不可見。)請注意,在串set
,在兩側空間=
有顯著...
我更喜歡將目錄名分配給變量,但不要在結尾加上\\
。 這樣可以在最少體操的情況下擴大價值。 個人喜好-但您同時使用了兩種方式...
插入記號不前,需要(
之前只需要)
在句法將關閉一個開括號(即在parenthesised語句序列中可能發生的if
, else
或do
。)用於隨意,這可能會導致雜散例如,文件名中的文字插入符。
行尾插入符號是一種有效但容易丟失且很少使用的技術。 為打破語句多行的規則是粗制濫造,繼續do
, if
還是else
在同一物理線路作為其(
和else
在同一物理線路的閉合括號它前面,然后不需要EOL-插入符。
批處理只是通過語句收費。 它沒有end of a procedure
概念,需要告知過程何時結束。 這可以通過goto :eof
語句(跳轉到文件的物理結尾)或exit /b
語句(從子例程返回,可以選擇設置錯誤errorlevel
goto :eof
在大多數情況下可以有效地執行smae事情而且更常見。)
%%〜nxi表示文件%%i
的名稱和擴展名。 當然,單獨使用%%~ni
及其對應對象是合法的,但這不是必須的。 但是請注意,這些部分應在子程序的"quotes"
發送,因為每個部分都可能包含空格。 "quotes"
使包含空格的字符串顯示為一個帶空格的字符串,而不是一系列字符串。
> nul將move
命令的報告“已move
1個文件”重定向到位存儲桶。
在刪除call
應用的引號后,應在checkfilename
設置兩個變量-這是~
在參數編號之前的目的。
counter
可以設置為零,然后遞增。
如果建議的新文件名存在,則只需增加數字並重試,直到找到不存在的名稱。 是的- counter
最終會用完。 它在2 ** 31-1處最高。 可能要花一點時間...
請注意在if exist
和move
使用quotes
。 這是為了防止文件/目錄名中出現空格。 先前使用的for %%i in ("%tempdir%\\*")
...您可能會注意到,在我的測試中,我(故意)使用了包含空格的目錄名。 碰巧的是,我使用的文件名中也有空格。
最后一個警告-毫無疑問,某些奇怪的文件名可能會阻塞這些過程,但它們之間應該相去甚遠。 例如,包含插入符號的文件名可能是一個問題。
歡迎批量!
除非這是一個學習項目,否則建議您學習XCOPY命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.