Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Копирование файлов (http://forum.oszone.net/showthread.php?t=345567)

cutter47 18-06-2020 09:40 2925423

Копирование файлов
 
Приветствую всех, подскажите пожалуйста по такому вопросу - имеется файл -
list.txt в котором указаны названия файлов с их путями, пример:

list.txt
c:\117888\asd.txt
c:\987898\zxdfg.txt
c:\354687\asd.txt
c:\567765\rty.txt
c:\785565\asd.txt


как мне все эти файлы скопировать в нужную папку например: d:\backup\
при условии что если копируемый файл уже имеется в папке назначения, то он не перезаписывался, а копировался с новым именем, например добавляя суффикс номера файла, например asd.txt asd(1).txt asd(2).txt из примера list.txt выше.
Прошу помощи в этом, буду вам очень благодарен.

megaloman 18-06-2020 12:26 2925447

Код:

@Echo Off
        Set "TxtFile=Z:\Box_In\list.txt"
        Set "BoxOut=D:\Backup"
        Set /A MaxLen=3

        2>nul Md "%BoxOut%"
        FOR /F "usebackq delims=" %%f IN ("%TxtFile%") DO Call :AddFile "%BoxOut%" "%%f" %MaxLen%
Exit /B

:AddFile
        If Not Exist %2 Exit /B 1
        If Not Exist "%~1\%~nx2" >nul Copy %2 "%~1\"
        Set /A N=10000000
        :Begin
                Set /A N+=1
                Call Set "OutName=%~1\%~n2(%%N:~-%3%%)%~x2"
                If Exist "%OutName%" GoTo :Begin
        >nul Copy %2 "%OutName%"
Exit /B


alpap 18-06-2020 12:33 2925448

Код:

@echo off
set "d_out=d:\backup"
set "f=C:\list.txt"

<"%f%" (for /f "delims=" %%a in ('more') do call :#cp "%d_out%" "%%a")
exit

:#cp
 setlocal
  pushd "%~1"
  if not exist "%~n2%n%%~x2" (>nul copy "%~2" "%~n2%n%%~x2") else (set /a n+=1& goto #cp)
  popd
 endlocal
exit /b

если надо именно такой формат: asd(2).txt
Код:

@echo off
set "d_out=d:\backup"
set "f=C:\list.txt"

<"%f%" (for /f "delims=" %%a in ('more') do call :#cp "%d_out%" "%%a")
exit

:#cp
 setlocal
  pushd "%~1"
  set /a n+=1
  if not exist "%~n2(%n%)%~x2" (>nul copy "%~2" "%~n2(%n%)%~x2") else goto #cp
  popd
 endlocal
exit /b


cutter47 18-06-2020 22:26 2925492

Всем большое спасибо !
Но периодически батник во всех предложенных вариантах выдает такое https://prnt.sc/t2ba1x

Fors1k 19-06-2020 12:59 2925530

powershell
Код:

param(
    $path  = "C:\list.txt",
    $backup = "d:\backup\"
)cls

gc $path|%{$q=gi -lite $_;
$i=0; $new=$backup+$q.Name
while(Test-Path $new){$i++
    $new = $backup+$q.Name
    $new = $new.replace($q.basename, $q.basename+"($i)")
}copy-item  -lite $_ $new}


alpap 19-06-2020 14:02 2925538

Цитата:

Цитата cutter47
батник во всех предложенных вариантах выдает такое »

это для моего кода будет, если строк много, таков уж bat, увы.
а код megaloman запускали? Или переходите на PS как выше предложил Fors1k, там точно нет таких проблем.

megaloman 19-06-2020 14:42 2925539

cutter47, а какое количество одинаковых по имени файлов возможно? У меня сейчас было MaxLen=3, то есть максимум 999+1 файл
(формат имени "имя(ххх).расширение"). (ххх) - такой формат нужен для удобной сортировке файлов по имени в проводнике или файл-менеджере. Можно этот параметр увеличить, при необходимости. Я протестировал батник с List.txt с >1600 строк - отработал без замечаний, хотя и долго.
А какие реально имена файлов? Если в них нет пробелов, то реально существенно ускорить его работу.

cutter47 21-06-2020 14:38 2925775

Вложений: 1
Здравствуйте всем, спасибо большое за помощь, длина пути может содержать более 300 символов, в пути встречаются папки с китайскими иероглифами.
List.txt будет содержать чуть менее 3 миллионов строк (в принципе можно разбить на части).
Повторов копируемых файлов может быть до 100 тысяч (все разные, поэтому перезапись не приемлема)
С такими путями через проводник не работаю, работаю через тотал коммандер.
Пример строк из файла List.txt прикрепляю.

http://forum.oszone.net/attachment.p...1&d=1592739394


Время: 21:15.

Время: 21:15.
© OSzone.net 2001-