
你好,所以我有以下問題
假設您有一些包含不同檔案的 Windows 資料夾結構(所有檔案具有不同的名稱,但可能具有相同的副檔名):
dirA
subDirA
file1.png
file2.dds
file3.jpeg
dirB
subDirB
subSubDirB
file4.tiff
some_txt.txt
test.cfg
final.docx
現在,您將所有檔案遞歸複製到其他目錄:
file1.png
file2.dds
file3.jpeg
file4.tiff
some_txt.txt
test.cfg
final.docx
現在我要做的就是將所有這些文件複製回原來的資料夾(注意以前的資料夾和文件仍然在那裡,我只是複製了它們)並覆蓋以前的文件。實際上,有很多文件,因此無法手動操作它們。
有沒有一些簡單的方法可以做到這一點,或者我最好編寫自訂程式/腳本來做到這一點?
答案1
我通常更喜歡像這樣的批次解決方案:
@echo off
set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"
for /r "%orig%" %%A in (*) do (
if exist "%dir%\%%~nxA" copy /y "%dir%\%%~nxA" "%%A"
)
該orig
變數將是您想要遞歸循環的頂部資料夾(即dirA
或dirB
來自您的範例區塊 - 或如果它們共用一個資料夾,只要您確信不存在重複的名稱,您就可以達到您想要的高度) 。該dir
變數將是您之前將所有文件複製到的資料夾。
for /r
循環通過全部根目錄中的檔案(即orig
及其所有子資料夾);對於每次迭代,它將文件的完整路徑和擴展名設為%%A
,然後在循環中我們查看%%~nxA
(文件簡化為其名稱和擴展名)是否存在於我們的dir
位置;如果它確實存在,我們會從dir
該orig
位置複製該檔案。就是這樣。如果您想產生日誌檔案來檢查,我通常建議使用 robocopy 並將循環中的所有內容輸出到文字檔案中,如下所示:
@echo off
set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"
setlocal enabledelayedexpansion
for /r "%orig%" %%A in (*) do (
set "path=%%~dpA"
if exist "%dir%\%%~nxA" robocopy "%dir%" "!path:~0,-1!" "%%~nxA"
)>>"%dir%\Return Files.txt"
唯一棘手的區別是啟用延遲擴展,以便您可以\
從%%~dpA
.
答案2
您想要做的事情是不可能的:新位置中的文件不再包含它們來自何處的資訊。這意味著腳本無法知道應該將每個檔案放在哪裡。
如果您確實有舊的目錄列表,則可以使用某種腳本語言輕鬆完成此操作。
答案3
如果你保證沒有名字重複,那麼使用類似
forfiles /P X:\originals_folder /S /C "cmd /c copy Y:\copies_folder\@file @path\@file /Y"
答案4
PowerShell 解決方案,使用哈希表來尋找路徑:
$originals = 'c:\originals'
$copies = 'c:\copies'
$hash = @{}
gci $originals -recurse | %{
$hash[$_.name] = $_.Fullname
}
gci $copies | %{copy-item $_ $hash[$_.Name] -force