Как скопировать все файлы из одного каталога в другой, только если файл не существует в целевых подпапках? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть каталог с файлами непосредственно в нем C:\test1.
Я хочу скопировать все эти файлы в C:\test2, только если файл не существует ни в одном подкаталоге в C:\test2.

Нужно написать пакетный файл Windows, который может сделать это.Любая помощь приветствуется.

Я пытался использовать следующее, но он не выполняет рекурсивный поиск в каталоге назначения:

For %%F In ("C:\test1*") Do If Not Exist "C:\test2\%%~nxF" Copy "%%F" "C:\test2\%%~nxF"

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Если вы хотите продвинуться вперед в PowerShell, этот код может помочь.Когда вы убедитесь, что файлы будут скопированы правильно, удалите -WhatIf из командлета Copy-Item.

Хорошо, я признаю, что у меня нет каталогов test1 и test2 для тестирования, но это будетвозможно, вы начали.

$targetdir = 'C:\test2'

Get-ChildItem -File -Path 'C:\test1' |
    ForEach-Object {
        if ((Get-ChildItem -File -Recurse -Path $targetdir -Filter $_.Name).Count -eq 0) {
            Copy-Item -Path $_.FullName -Destination $targetdir -WhatIf
        }
    }

Если вы сохраните скрипт выше как Copy-IfNone.ps1, то вы можете запустить его из оболочки cmd, используя:

powershell -NoProfile -File .\Copy-IfNone.ps1
0 голосов
/ 11 октября 2018

Примеры упрощают понимание требований к задаче для всех.
Итак, позвольте мне начать с примера.

Исходный каталог C:\test1 содержит следующие файлы:

  • Test1.txt
  • Test2.txt
  • Test3.txt

Целевой каталог дерево C:\test2 содержит следующие каталоги и файлы:

  • Подпапка1
    • Test2.txt
  • Подпапка2
    • Подпапка3
      • Test3.txt

Для этого примера просто скопировать файл Test1.txt в каталогC:\test2, поскольку Test2.txt и Test3.txt уже существуют во вложенных папках C:\test2.

Таким образом, каталог tree C:\test2 должен выглядеть следующим образом после выполнения пакетного файла:

  • Подпапка1
    • Test2.txt
  • Подпапка2
    • Subfolder3
      • Test3.txt
  • Test1.txt

Это может быть достигнуто с помощью:

@echo off
for %%I in ("C:\test1\*") do (
    dir "C:\test2\%%~nxI" /A-D /B /S >nul 2>nul
    if errorlevel 1 copy "%%I" "C:\test2\" >nul
)

Это также возможно сделатьс одной командной строкой :

@for %%I in ("C:\test1\*") do @dir "C:\test2\%%~nxI" /A-D /B /S >nul 2>nul || copy "%%I" "C:\test2\" >nul

Для понимания используемых команд и их работы откройте окно командной строки, выполните там следующие команды и полностью прочитайте все отображаемые страницы справки.для каждой команды очень тщательно.

  • dir /?
  • copy /?
  • echo /?
  • for /?
  • if /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...