簡體   English   中英

Windows批處理文件復制/重命名文件

[英]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語句序列中可能發生的ifelsedo 。)用於隨意,這可能會導致雜散例如,文件名中的文字插入符。

行尾插入符號是一種有效但容易丟失且很少使用的技術。 為打破語句多行的規則是粗制濫造,繼續doif還是else在同一物理線路作為其(else在同一物理線路的閉合括號它前面,然后不需要EOL-插入符。

批處理只是通過語句收費。 它沒有end of a procedure概念,需要告知過程何時結束。 這可以通過goto :eof語句(跳轉到文件的物理結尾)或exit /b語句(從子例程返回,可以選擇設置錯誤errorlevel goto :eof在大多數情況下可以有效地執行smae事情而且更常見。)

%%〜nxi表示文件%%i的名稱和擴展名。 當然,單獨使用%%~ni及其對應對象是合法的,但這不是必須的。 但是請注意,這些部分應在子程序的"quotes"發送,因為每個部分都可能包含空格。 "quotes"使包含空格的字符串顯示為一個帶空格的字符串,而不是一系列字符串。

> nulmove命令的報告“已move 1個文件”重定向到位存儲桶。

在刪除call應用的引號后,應在checkfilename設置兩個變量-這是~在參數編號之前的目的。

counter可以設置為零,然后遞增。

如果建議的新文件名存在,則只需增加數字並重試,直到找到不存在的名稱。 是的- counter最終會用完。 它在2 ** 31-1處最高。 可能要花一點時間...

請注意在if existmove使用quotes 這是為了防止文件/目錄名中出現空格。 先前使用的for %%i in ("%tempdir%\\*") ...您可能會注意到,在我的測試中,我(故意)使用了包含空格的目錄名。 碰巧的是,我使用的文件名中也有空格。

最后一個警告-毫無疑問,某些奇怪的文件名可能會阻塞這些過程,但它們之間應該相去甚遠。 例如,包含插入符號的文件名可能是一個問題。

歡迎批量!

除非這是一個學習項目,否則建議您學習XCOPY命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM