將文件從一個資料夾複製到這些文件最初所在的多個其他資料夾。視窗

將文件從一個資料夾複製到這些文件最初所在的多個其他資料夾。視窗

你好,所以我有以下問題

假設您有一些包含不同檔案的 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變數將是您想要遞歸循環的頂部資料夾(即dirAdirB來自您的範例區塊 - 或如果它們共用一個資料夾,只要您確信不存在重複的名稱,您就可以達到您想要的高度) 。該dir變數將是您之前將所有文件複製到的資料夾。

for /r循環通過全部根目錄中的檔案(即orig及其所有子資料夾);對於每次迭代,它將文件的完整路徑和擴展名設為%%A,然後在循環中我們查看%%~nxA(文件簡化為其名稱和擴展名)是否存在於我們的dir位置;如果它確實存在,我們會從dirorig位置複製該檔案。就是這樣。如果您想產生日誌檔案來檢查,我通常建議使用 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

相關內容