Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
sexbeer
0 / 0 / 0
Регистрация: 12.01.2016
Сообщений: 2
1

Копирование из одной папки в другую случайных неповторяющихся файлов

12.01.2016, 10:20. Просмотров 1739. Ответов 6
Метки нет (Все метки)

дорогие форумчане, необходимо создать батник, который копирует из папки с файлами (более 1000 штук) 255 случайных неповторяющихся файлов. файлы mp3. заранее спасибо
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2016, 10:20
Ответы с готовыми решениями:

Копирование файлов из одной папки в другую, но с пропуском одинаковых файлов в этих папках
Доброго времени суток. Прошу помощи в написании батника. Задача: Есть папка А с файлами 1,2,3 и...

Копирование файлов заданного типа с помощью команды copy из одной папки в другую
Вариант 3 Создайте командный файл копирования файлов заданного типа (с помощью ко- манды copy) из...

Копирование всех файлов с заданным расширением из одной заданной папки в другую заданную папку
Создайте командный файл, который копирует все файлы с расширением, заданным в качестве первого...

Копирование содержимого одной папки в другую с переименованием файлов и папок в случае совпадения имён
Добрый день! Необходимо решение следующей задачи: Есть папка OUT , находится к примеру "c:\out",...

Копирование TXT-файлов из одной папки и BMP-файлов из другой папки в папку, в которой находится пакетный файл
Доброго времени суток. У кого есть возможность сообразить какой код мне нужет чтобы сделать вот...

6
b0gus
286 / 180 / 78
Регистрация: 17.03.2014
Сообщений: 512
12.01.2016, 22:21 2
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@echo off
cls
SetLocal EnableExtensions EnableDelayedExpansion
set "from=C:\Temp\in dir"
set "to=C:\Temp\in dir\result"
set "file_cnt=255"
set "list=%temp%\%~n0"
title [moving %from%\*.mp3 %to%\]
 
                :: на всякий случай почистим папку назначения
>nul 2>nul del "%to%\*.mp3"
 
>"%list%" (2>nul dir /a-d/b "%from%\*.mp3"|find /v /n "")&<"%list%" (for /f %%v in ('find /v /c /n ""') do set "cnt=%%v")
if %cnt%==0 echo.files not found&pause&exit /b 1
if %cnt% LSS %file_cnt% echo.num files in source [%cnt%] ^< num files in dest ["%file_cnt%"]&pause&exit /b 2
 
:loop
if %file_cnt%==0 (echo.done^^!&pause&>nul del "%list%"&exit /b 0)
                :: псевдослучайное число см. cyberforum.ru/post3902665.html
set /a "i=%random%%%(cnt)+1"
<"%list%" (for /f "delims=" %%v in ('find "[%i%]" ') do for /f "tokens=2 delims=[]" %%a in ("%%v") do (
           if NOT exist "%to%\%%a" echo.left copy !file_cnt! files...&set /a "file_cnt-=1"&>nul copy /y "%from%\%%a" "%to%"))
goto :loop
0
ComSpec
3411 / 1955 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
13.01.2016, 04:24 3
Использование "блочно-конвейерной структуры кода":

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
 
set "src=C:\Test 1"
set "dest=C:\Test 2"
set "ext=.mp3"
set "number=255"
 
(
dir/a-d/b "%src%\*%ext%"
)|(
cmd/v/c "for /f "delims=" %%i in ('more') do @echo !random!:%%i"
)|(
sort
)|(
findstr/n .
)|(
cmd/c "for /f "tokens=1,3 delims=:" %%i in ('more') do @copy/y "%src%\%%j" "%dest%"& if %%i equ %number% exit/b"
)
 
exit/b
.

На самом деле вся эта приведённая мной конструкция -- всего лишь одна строка
Windows Batch file
1
dir/a-d/b "%src%\*%ext%"| cmd/v/c for /f "delims=" %%i in ('more') do @echo !random!:%%i| sort| findstr/n .| cmd/c for /f "tokens=1,3 delims=:" %%i in ('more') do @copy/y "%src%\%%j" "%dest%"^& if %%i equ %number% exit/b
,
разделённая скобками на блоки для наглядности.

Преимущество такой структуры кода -- это возможность легко добавлять, удалять или заменять отдельные блоки кода.

Логика такой структуры кода очень сильно напоминет логику организации кода в PowerShell.
2
sexbeer
0 / 0 / 0
Регистрация: 12.01.2016
Сообщений: 2
13.01.2016, 10:42  [ТС] 4
после выполнения в папке с результатами меньше 255 файлов. проверял несколько раз, количество всегда разное. делаю вывод, что выборка неуникальна, и повторно выбранный файл перезаписывает выбранный ранее.
0
ComSpec
3411 / 1955 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
13.01.2016, 15:22 5
Цитата Сообщение от sexbeer Посмотреть сообщение
после выполнения в папке с результатами меньше 255 файлов. проверял несколько раз, количество всегда разное. делаю вывод, что выборка неуникальна, и повторно выбранный файл перезаписывает выбранный ранее.


Позвольте выводы делать специалистам.

Выборка содержит только уникальные элементы, но некоторые файлы не могут быть скопированы.

1. Первая и наиболее вероятная причина -- присутствие в именах некоторых файлов нестандартных символов,
например, тире, двойных угловых кавычек и т. п., или символов Юникода.

2. Вторая возможная причина -- наличие у некоторых файлы атрибутов "Скрытый" и/или "Системный".

Приведите в порядок имена и/или атрибуты копируемых файлов, и проблем не будет.
0
alpap
2147 / 1451 / 486
Регистрация: 26.04.2015
Сообщений: 4,934
14.01.2016, 20:42 6
Файл с именем (-=+!';.,%#@ [{)~`№) взял, а с именем содержащем ^ - не находит.
0
b0gus
286 / 180 / 78
Регистрация: 17.03.2014
Сообщений: 512
14.01.2016, 21:10 7
Цитата Сообщение от ComSpec Посмотреть сообщение
Использование "блочно-конвейерной структуры кода"
следует отметить, что в блоках "()", комментарии использовать нельзя/не следует

ЗЫ.зачарованый красотой решения, не удержался и сделал анализ кода,
вот что у меня получилось
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
:: 1) dir/a-d/b "%src%\*%ext%"
::
::  выводит и передаёт по конвееру примерно такой список файлов:
::      9.mp3 
::      6.mp3 
::      5 1.mp3 
::      7.mp3 
::      1 1.mp3 
::      4.mp3 
::      2.mp3 
::      8.mp3 
::      3.mp3 
::
:: 2) cmd/v/c "for /f "delims=" %%i in ('more') do @echo !random!:%%i"
:: 
::  запускает новый экземляр CMD, в котором цикл for /f
::  командой 'more' выводит полученный по конвееру вывод dir,
::  и в теле цикла for выводит:
::        !random!         :           %%i
::    <случайное число><символ ":"><очередное имя файла>
::  
::  чтобы в теле цикла for %random% выдавал псевдо-случайное число,
::  вместо % НУЖНО использовать !, поэтому новый экземляр CMD
::  запускается с ключом /v
::      
::      результат передаётся по конвееру следующей команде и
::  выглядит примерно так:
::      2309:9.mp3
::      26341:6.mp3
::      12650:5 1.mp3
::      14880:7.mp3
::      17684:1 1.mp3
::      14184:4.mp3
::      18427:2.mp3
::      2781:8.mp3
::      29532:3.mp3
:: 3) sort
::  здесь всё просто: на вход получает строки по конвееру от cmd/v/c,
::  сортирует их ПО ВОЗРАСТАНИЮ, и передаёт по конвееру следующей команде
::  примерно следующее:
::      12650:5 1.mp3
::      14184:4.mp3
::      14880:7.mp3
::      17684:1 1.mp3
::      18427:2.mp3
::      2309:9.mp3
::      26341:6.mp3
::      2781:8.mp3
::      29532:3.mp3
:: 4) findstr/n .
::  тоже всё просто: findstr выполняет нумерацию строк (см. findstr/? ключ /n),
::  полученных по конвееру от sort и передаёт по конвееру следующей команде
::  примерно следующее:
::      1:12650:5 1.mp3
::      2:14184:4.mp3
::      3:14880:7.mp3
::      4:17684:1 1.mp3
::      5:18427:2.mp3
::      6:2309:9.mp3
::      7:26341:6.mp3
::      8:2781:8.mp3
::      9:29532:3.mp3
::
::  красота! :) 
::  перед нами строки из трёх токенов, поэтому задача ТС 
::  решается следуюшим простым циклом for
::
:: 5) cmd/c "for /f "tokens=1,3 delims=:" %%i in ('more') do @copy/y "%src%\%%j" "%dest%"& if %%i equ %number% exit/b"
::  
::  запускает новый экземляр CMD, в котором цикл for /f
::  командой 'more' выводит полученный по конвееру вывод findstr
::  и в теле цикла for:
::  1) копирует очередной файл в папку назначения (3-й токен)
::      @copy/y "%from%\%%j"
::  2) по достижению нужного кол-ва файлов (1-й токен) завершает CMD
::      if %%i equ %file_cnt% exit/b
0
14.01.2016, 21:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2016, 21:10

Копирование содержимого одной папки в другую
Ребята помогите решить одну проблему. Я хочу сделать так, если папки не то создать и скопировать...

Копирование файла из одной папки в другую с заменой по сети
Доброго времени суток. Сам того не желая столкнулся с проблемой. Будучи мало знаком с языками...

Копирование файла из одной папки в другую с именем текущего месяца
не знаю как написать скрипт, что надо: один файл А из папки копировать в другую папку с именем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru