2016-07-26 74 views
0

我想創建一個應該將文件從一個文件夾複製到另一個文件的腳本。如何重命名正在複製和複製文件的文件

由於文件大小可能高達1000 MB,因此可能需要幾秒鐘的時間才能完全複製它。在發生這種情況時,我希望目標文件夾中的文件名前綴爲下劃線(_)。

將文件完全複製到目標文件夾後,應該從文件名中刪除_。這樣做的目的是爲了確保另一個進程不應該從目標文件夾中選取不完整的文件。

我們該如何使用批處理腳本來做到這一點?目前我的批處理文件正在複製並將文件移動到另一個文件夾,但我不知道如何在下劃線前加下劃線,然後在文件完全移動後再從文件名中移除。

這是我的2行代碼,它是複製和移動文件。

copy %1\Customer_*.xml C:\Users\ard\Documents\Folder1 
move %1\Customer_*.xml %1\Archive 

如果無法使用批處理腳本來完成,那麼VB腳本也應該從SRC工作

回答

2

你想要什麼,用文字:

對於C:\source每個受影響的文件:

  • 複製文件xC:\destination\_x
  • 重命名文件C:\destination\_xC:\destination\x

和Windows批處理代碼,有幾個演員:

@echo off 
setlocal 

set "SOURCE=%1" 
set "DESTINATION=C:\Users\ard\Documents\Folder1" 

for /f "usebackq delims=" %%x in (`dir /b "%SOURCE%\Customer_*.xml"`) do (
    if exist "%DESTINATION%\%%x" (
     echo %%x - already exists at destination 
    ) else (
     echo %%x 
     copy "%SOURCE%\%%x" "%DESTINATION%\_%%x" > NUL && rename "%DESTINATION%\_%%x" "%%x" 
    ) 
) 

注:

  • 線明智
  • 在我們的例子中,該命令是dir /b "%SOURCE%\*.xml"for循環可以遍歷一個命令的輸出,即源文件夾中匹配文件的「裸」列表
  • usebackq表示該命令由反引號定界,允許在命令本身內使用雙引號
  • delims=設置字段分隔符爲「none」,否則會for每個文件名分成記號,如果它包含空格
  • > NUL抑制「1個文件(多個)複製。」從copy
  • &&成功消息意味着rename只執行,如果copy成功
+0

錯誤處理? – joeking

+0

@joeking這有點不像一個完整的問題。 – Tomalak

+0

好的,如果複製或重命名失敗會發生什麼?如果複製失敗,那麼它不會告訴你哪個文件失敗。如果重命名失敗,則會將臨時文件保留在那裏,並不會告訴您哪個文件失敗。 – joeking

1

我的例子複製一個新的名字什特,然後還原回舊名: BN是源文件的基本名稱。

for %%a in (src\*.xml) do (
set bn=%%~nxa 
copy %%a dest\!bn!_ 
rename dest\!bn!_ !bn! 
) 
+0

'set bn = %%〜nxa'會更好(它也會刪除依賴關係在'enabledelayedexpansion') – Tomalak

+0

這仍然需要 「SETLOCAL ENABLEDELAYEDEXPANSION」。 「bn」變量是不需要的 - 擺脫這一點,你不需要延遲擴展 – joeking

+0

此外,沒有錯誤處理。例如:複製%%一個dest \ %%〜nxa> nul || (回聲失敗!%% a&exit/b 1) – joeking

2

刪除前綴是不平凡的,但刪除後綴(新的擴展)很簡單。所以我會附加一個新的擴展名,如.inProgress。然後,您可以使用通配符使用兩個簡單命令來複制和重命名文件集合。

但此舉命令不允許重命名多個文件,所以FOR循環是必需的。我將展示代碼,但我不認爲在OP的情況下它確實是必需的。在我看來,源文件夾和目標文件夾位於同一個驅動器上,因此移動應該幾乎是瞬時的,並且不應該使用臨時中間名。

copy "%1\Customer_*.xml" "C:\Users\ard\Documents\Folder1\*.*.inProgress" 
ren "C:\Users\ard\Documents\Folder1\*.inProgress" *. 

for %%F in ("%1\Customer_*.xml") do (
    move "%%F" "%1\Archive\%%~nxF.inProgress" 
    ren "%1\Archive\%%~nxF.inProgress" *. 
) 

請參閱How does the Windows RENAME command interpret wildcards?瞭解有關重命名工作原因的信息。

注意,所有複製的文件將顯示爲「.inProgress」直到整個拷貝操作已完成。如果您希望每個文件儘快可用,那麼COPY也需要一個FOR循環:

for %%F in ("%1\Customer_*.xml") do (
    copy "%%F" "C:\Users\ard\Documents\Folder1\%%~nxF.inProgress" 
    ren "C:\Users\ard\Documents\Folder1\%%~nxF.inProgress" *. 
) 
+0

不錯的解決方案,我喜歡它。 – Tomalak

+0

@Tomalak - 除了我有一個錯誤! MOVE不允許您使用通配符重命名多個文件。我編輯了我的答案。 – dbenham

+0

啊,詳情。 ;)但是,我的評論仍然適用。 – Tomalak

相關問題