File. Copy Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Копирует существующий файл в новый файл.
Перегрузки
Копирует существующий файл в новый файл. Перезапись файла с тем же именем не разрешена.
Копирует существующий файл в новый файл. Перезапись файла с тем же именем разрешена.
Copy(String, String)
Копирует существующий файл в новый файл. Перезапись файла с тем же именем не разрешена.
public: static void Copy(System::String ^ sourceFileName, System::String ^ destFileName);
public static void Copy (string sourceFileName, string destFileName);
static member Copy : string * string -> unit
Public Shared Sub Copy (sourceFileName As String, destFileName As String)
Параметры
sourceFileName String
destFileName String
Имя целевого файла. Это не может быть имя каталога или имя существующего файла.
Исключения
У вызывающего объекта отсутствует необходимое разрешение.
sourceFileName или destFileName представляет собой строку нулевой длины, строку, содержащую только пробелы, или строку, содержащую один или несколько недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars().
Параметр sourceFileName или destFileName определяет каталог.
Параметр sourceFileName или destFileName имеет значение null .
Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.
В sourceFileName или destFileName указан недопустимый путь (например, ведущий на несопоставленный диск).
Не удалось найти sourceFileName .
Произошла ошибка ввода-вывода.
Параметр sourceFileName или destFileName имеет недопустимый формат.
Примеры
В следующем примере файлы копируются в папку резервной копии C:\archives\2008. В нем используются две перегрузки Copy метода следующим образом:
- Сначала используется перегрузка File.Copy(String, String) метода для копирования текстовых (.txt) файлов. Код показывает, что эта перегрузка не разрешает перезапись уже скопированных файлов.
- Затем он использует перегрузку File.Copy(String, String, Boolean) метода для копирования изображений (.jpg файлов). Код показывает, что эта перегрузка разрешает перезапись уже скопированных файлов.
string sourceDir = @"c:\current"; string backupDir = @"c:\archives\2008"; try < string[] picList = Directory.GetFiles(sourceDir, "*.jpg"); string[] txtList = Directory.GetFiles(sourceDir, "*.txt"); // Copy picture files. foreach (string f in picList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true); >// Copy text files. foreach (string f in txtList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); try < // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)); >// Catch exception if the file was already copied. catch (IOException copyError) < Console.WriteLine(copyError.Message); >> // Delete source files that were copied. foreach (string f in txtList) < File.Delete(f); >foreach (string f in picList) < File.Delete(f); >> catch (DirectoryNotFoundException dirNotFound)
let sourceDir = @"c:\current" let backupDir = @"c:\archives\2008" try let picList = Directory.GetFiles(sourceDir, "*.jpg") let txtList = Directory.GetFiles(sourceDir, "*.txt") // Copy picture files. for f in picList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true) // Copy text files. for f in txtList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) try // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) // Catch exception if the file was already copied. with | :? IOException as copyError -> printfn $"" // Delete source files that were copied. for f in txtList do File.Delete f for f in picList do File.Delete f // Catch exception if the file was already copied. with | :? DirectoryNotFoundException as dirNotFound -> printfn $""
Dim sourceDir As String = "c:\current" Dim backupDir As String = "c:\archives\2008" Try Dim picList As String() = Directory.GetFiles(sourceDir, "*.jpg") Dim txtList As String() = Directory.GetFiles(sourceDir, "*.txt") ' Copy picture files. For Each f As String In picList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) ' Use the Path.Combine method to safely append the file name to the path. ' Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), True) Next ' Copy text files. For Each f As String In txtList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) Try ' Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) ' Catch exception if the file was already copied. Catch copyError As IOException Console.WriteLine(copyError.Message) End Try Next For Each f As String In txtList File.Delete(f) Next For Each f As String In picList File.Delete(f) Next Catch dirNotFound As DirectoryNotFoundException Console.WriteLine(dirNotFound.Message) End Try
Комментарии
Этот метод эквивалентен перегрузке Copy(String, String, Boolean) метода с параметром overwrite , равным false .
Параметры sourceFileName и destFileName могут указывать относительные или абсолютные сведения о пути. Относительные сведения о пути интерпретируются как относительные относительно текущего рабочего каталога. Чтобы получить текущий рабочий каталог, см. Directory.GetCurrentDirectory метод . Этот метод не поддерживает подстановочные знаки в параметрах.
Атрибуты исходного файла сохраняются в скопированном файле.
См. также раздел
- Move(String, String)
- Move(String, String)
- Файловый и потоковый ввод-вывод
- Чтение текста из файла
- Практическое руководство. Запись текста в файл
- Практическое руководство. Считывание данных из нового файла и запись в этот файл
Применяется к
Copy(String, String, Boolean)
Копирует существующий файл в новый файл. Перезапись файла с тем же именем разрешена.
public: static void Copy(System::String ^ sourceFileName, System::String ^ destFileName, bool overwrite);
public static void Copy (string sourceFileName, string destFileName, bool overwrite);
static member Copy : string * string * bool -> unit
Public Shared Sub Copy (sourceFileName As String, destFileName As String, overwrite As Boolean)
Параметры
sourceFileName String
destFileName String
Имя целевого файла. Это не может быть имя каталога.
true Значение , если целевой файл следует заменить, если он уже существует; в противном случае — false .
Исключения
У вызывающего объекта отсутствует необходимое разрешение.
Объект destFileName доступен только для чтения.
overwrite равен true , destFileName существует и скрыт, но sourceFileName не скрыт.
sourceFileName или destFileName представляет собой строку нулевой длины, строку, содержащую только пробелы, или строку, содержащую один или несколько недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars().
Параметр sourceFileName или destFileName определяет каталог.
Параметр sourceFileName или destFileName имеет значение null .
Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.
В sourceFileName или destFileName указан недопустимый путь (например, ведущий на несопоставленный диск).
Не удалось найти sourceFileName .
destFileName существует, и overwrite равно false .
Произошла ошибка ввода-вывода.
Параметр sourceFileName или destFileName имеет недопустимый формат.
Примеры
В следующем примере файлы копируются в папку резервной копии C:\archives\2008. В нем используются две перегрузки Copy метода следующим образом:
- Сначала используется перегрузка File.Copy(String, String) метода для копирования текстовых (.txt) файлов. Код показывает, что эта перегрузка не разрешает перезапись уже скопированных файлов.
Затем он использует перегрузку File.Copy(String, String, Boolean) метода для копирования изображений (.jpg файлов). Код показывает, что эта перегрузка разрешает перезапись уже скопированных файлов.
string sourceDir = @"c:\current"; string backupDir = @"c:\archives\2008"; try < string[] picList = Directory.GetFiles(sourceDir, "*.jpg"); string[] txtList = Directory.GetFiles(sourceDir, "*.txt"); // Copy picture files. foreach (string f in picList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true); >// Copy text files. foreach (string f in txtList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); try < // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)); >// Catch exception if the file was already copied. catch (IOException copyError) < Console.WriteLine(copyError.Message); >> // Delete source files that were copied. foreach (string f in txtList) < File.Delete(f); >foreach (string f in picList) < File.Delete(f); >> catch (DirectoryNotFoundException dirNotFound)
let sourceDir = @"c:\current" let backupDir = @"c:\archives\2008" try let picList = Directory.GetFiles(sourceDir, "*.jpg") let txtList = Directory.GetFiles(sourceDir, "*.txt") // Copy picture files. for f in picList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true) // Copy text files. for f in txtList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) try // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) // Catch exception if the file was already copied. with | :? IOException as copyError -> printfn $"" // Delete source files that were copied. for f in txtList do File.Delete f for f in picList do File.Delete f // Catch exception if the file was already copied. with | :? DirectoryNotFoundException as dirNotFound -> printfn $""
Dim sourceDir As String = "c:\current" Dim backupDir As String = "c:\archives\2008" Try Dim picList As String() = Directory.GetFiles(sourceDir, "*.jpg") Dim txtList As String() = Directory.GetFiles(sourceDir, "*.txt") ' Copy picture files. For Each f As String In picList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) ' Use the Path.Combine method to safely append the file name to the path. ' Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), True) Next ' Copy text files. For Each f As String In txtList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) Try ' Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) ' Catch exception if the file was already copied. Catch copyError As IOException Console.WriteLine(copyError.Message) End Try Next For Each f As String In txtList File.Delete(f) Next For Each f As String In picList File.Delete(f) Next Catch dirNotFound As DirectoryNotFoundException Console.WriteLine(dirNotFound.Message) End Try
Комментарии
Параметры sourceFileName и destFileName могут указывать относительные или абсолютные сведения о пути. Относительные сведения о пути интерпретируются как относительные относительно текущего рабочего каталога. Этот метод не поддерживает подстановочные знаки в параметрах.
Атрибуты исходного файла сохраняются в скопированном файле.
Список распространенных задач ввода-вывода см. в разделе Общие задачи ввода-вывода.
См. также раздел
- Move(String, String)
- Move(String, String)
- Файловый и потоковый ввод-вывод
- Чтение текста из файла
- Практическое руководство. Запись текста в файл
- Практическое руководство. Считывание данных из нового файла и запись в этот файл
Статья Как скопировать файл с помощью языка C#?
Из этой статьи Вы узнаете, как скопировать файл, используя язык c#. Но, для начала хотелось бы сказать, что, не смотря на то, что данная операция на самом деле состоит из нескольких этапов, например, таких как создание нового файла, по байтовое копирование информации, удаление старого файла. В языке csharp нас избавили от всех этих «мелких нюансов», поэтому для того, чтобы скопировать файл 1.txt из папки c:\dir1 в папку с:\dir2, вам всего лишь нужно в своей программе написать буквально одну строчку кода.
using System.IO; //добавить! File.Copy(@"C:\dir1\1.txt", @"C:\dir2\2.txt", true);
Для работы мы используем класс File и метод Copy, в который в качестве первого параметра, передаём полный путь к файлу, который необходимо скопировать. Вторым параметров указываем, куда мы копируем файл. Третий, необязательный параметр, который имеет тип bool, позволяет определить действие, которое нужно выполнить, если в папке dir2 уже содержится файл (2.txt). Например, если установить значение true, то тогда при копировании файла (1.txt), файл (2.txt) будет перезаписан, если же мы установим значение false, то в таком случае получим выброс исключения, так как файл уже существует, а его изменение (перезапись) мы запретили.
Так же не забывайте при работе с пространством имён System.IO использовать блоки try catch.
try < File.Copy(); >catch (Exception ex)
Как скопировать все файлы?
И ещё один пример, в котором рассмотрим простую задачу, в которой нужно скопировать все файлы из папки Dir1 в папку Dir2.
//откуда копируем string Dir1 = @"C:\Dirs\Dir1"; //куда копируем string Dir2 = @"C:\Dirs\Dir2"; try < DirectoryInfo dirInfo = new DirectoryInfo(Dir1); foreach (FileInfo file in dirInfo.GetFiles("*.*")) < File.Copy(file.FullName, Dir2 + "\\" + file.Name, true); >> catch (Exception ex)
Сначала с помощью метода GetFiles, используя маску (*.*), получаем все файлы в папке Dir1, а затем по очереди копируем их. Если Вам необходимо скопировать все файлы только какого-то определенного типа, например все текстовые файлы (.txt), то тогда указываем маску (*.txt), для mp3 файлов (*.mp3) и так далее. Значение true указываем в том случаи, если требуется перезаписать старые файлы в папке Dir2.
- Передача данных между формами в языке c#
- Свойство ColumnCount элемента управления DataGridView
- Определение дня недели по дате
Комментарии, перенесенные из блога
САНЯ
24.08.2016 в 09:37
хм, к примеру я получил список файлов в папке и подпапках с датой изменения
string[] files = Directory.GetFiles(@"C:2", "*", SearchOption.AllDirectories); for (int i = 0; i
а как теперь скопировать все файлы к примеру в c:1 и потом через некоторе время скопировать файлы которые изменились?
ADMIN
25.08.2016 в 06:15
«а как теперь скопировать все файлы к примеру в c:1»
string[] files = Directory.GetFiles(@"C:2"); FileInfo fi; foreach (string file in files) < fi = new FileInfo(file); File.Copy(file, "C:1" + fi.Name); //или //File.Copy(file, "C:1" + Path.GetFileName(file)); >//или DirectoryInfo dirInfo = new DirectoryInfo(@"C:2"); foreach (FileInfo file in dirInfo.GetFiles())
и потом через некоторе время скопировать файлы которые изменились?
Например, можно добавить таймер и запускать его сразу после первого копирования.
timer1.Enabled = true; timer1.Interval = //уст. какой-то интервал времени; timer1.Tick += new EventHandler(timer1_Tick); void timer1_Tick(object sender, EventArgs e) < //1. Проверяем есть ли изменения //2. Копируем файлы, которые изменились >
САНЯ
25.08.2016 в 20:24
string[] files = Directory.GetFiles(@"C:2"); FileInfo fi; foreach (string file in files)
пару вопросов, что не задал сразу, сорри!
этим кодом я копирую файлы в папке 2, но в ней есть подпапки, а как скопировать все папки со всеми файлами? список папок и файлов я получаю в приведенным мной кодом выше, так же я получаю дату изменения, к примеру я первый раз сразу копирую все папки и файлы из 2, а потом будет работать таймер по которому будет копирование измененых файлов. Точнее я же получаю список файлов и папок в листбокс1, это к примеру, при запуске программы и сразу их копирую, а потом работает таймер, где я уже вывожу список папок и файлов листбокс2, и потом ведь я могу их сравнить и удалить совпадения по дате изменения, и остануться те которые нужно будет скопировать… как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))
ADMIN
27.08.2016 в 14:49
как скопировать все папки со всеми файлами
можно использовать рекурсию, например:
//рекурсия private void CopyDirsAndFiles(string FromDir, string ToDir) < Directory.CreateDirectory(ToDir); foreach (string file in Directory.GetFiles(FromDir)) < File.Copy(file, ToDir + "" + Path.GetFileName(file)); >foreach (string dir in Directory.GetDirectories(FromDir)) < CopyDirsAndFiles(dir, ToDir + "" + Path.GetFileName(dir)); >> //откуда - куда CopyDirsAndFiles("C:2", "C:1");
как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))
private void Form1_Load(object sender, EventArgs e) < timer1.Enabled = false; CopyDirsAndFiles(); //копирует 1 раз timer1.Enabled = true; timer1.Tick += new EventHandler(timer1_Tick); >void timer1_Tick(object sender, EventArgs e) < //1. Проверяем есть ли изменения //2. Копируем файлы, которые изменились >
САНЯ
27.08.2016 в 23:58
если честно, то у меня ничего не выходит, что то я совсем запутался вот полный листинг кода, задача получить все файлы и папки с подпапками в с:2 вывести листбокс1, потом скопировать в c:1, а там уже сам))
[cut]
void CopyAllDirsAndFiles(string FromDir, string ToDir) < Directory.CreateDirectory(ToDir); listBox1.Items.Add(ToDir); foreach (string file in Directory.GetFiles(FromDir)) < File.Copy(file, ToDir + "" + Path.GetFileName(file)); listBox1.Items.Add(file); >foreach (string dir in Directory.GetDirectories(FromDir)) < CopyAllDirsAndFiles(dir, ToDir + "" + Path.GetFileName(dir)); >>
САНЯ
29.08.2016 в 17:48
File.Copy(file, ToDir + «» + Path.GetFileName(file));
подскажи, а как сделать перезапись файл — этот метод запрещает это сделать? и такой если файл будет открыт, он скопируеться?
ADMIN
31.08.2016 в 16:29
подскажи, а как сделать перезапись файл — этот метод запрещает это сделать?»
Ответ на этот вопрос есть в статье.
если файл будет открыт, он скопируеться?
Да, но лучше всё равно обработать возможность возникновения System.IO.IOException
САНЯ
31.08.2016 в 19:51
админ, я использую CopyDir(@»C:2″, @»C:1″ а как указать вместо c:2 список папок в листбокс? пробывал пару вариантов, но видать не правильно
listBox1.Items.Add("c:2"); listBox1.Items.Add("c:3"); listBox1.Items.Add("c:4"); foreach (string dir in listBox1.Items)
САНЯ
02.09.2016 в 19:39
админ, новерно крайний вопрос)) в листбокс файл + дата изменения, скопировать как не получаеться и оно понятно, а как отделить при копировании дату изменения до пробела
foreach (string f in Directory.GetFiles(FromDir)) < listBox2.Items.Add(f + " " + Directory.GetLastWriteTime(FromDir)); try < File.Copy(f, ToDir + "" + Path.GetFileName(f), true); >catch (Exception ex) < MessageBox.Show(ex.Message); >>
ADMIN
04.09.2016 в 04:44
Получить только путь из строки?
string str = listBox1.Items[0].ToString(); string path = str.Substring(0, str.IndexOf(' '));
САНЯ
05.09.2016 в 05:30
Админ а что не правильно, пытаюсь удалить совпадение строк? удаляет только первую
for ( int i = 0; i < listBox1.Items.Count; i++) < if (listBox1.Items[i].ToString() == listBox2.Items[i].ToString()) < listBox1.Items.RemoveAt(i); >>
ADMIN
06.09.2016 в 03:32
Поставь точку остановы и посмотри, что происходит со списком listbox1 до удаления элемента и после.
САНЯ
07.09.2016 в 01:14
по идее должны быть так? переменные обьявлены в классе, я понимаю что это должно быть просто, но что то совсем не могу вникнуть…. очень хочу научится , но самоучкой трудно((
if (listBox1.Items[w].ToString() == listBox2.Items[q].ToString()) < for ( int w = 0; w < listBox1.Items.Count; w++) < listBox1.Items.RemoveAt(w); >>
ADMIN
07.09.2016 в 17:51
for (int i=0; i < listBox1.Items.Count; i++) < for (int k = 0; k < listBox2.Items.Count; k++) < if (listBox1.Items[i].Equals(listBox2.Items[k])) < listBox2.Items.Remove(listBox2.Items[k]); --k; >> >
САНЯ
09.09.2016 в 01:31
админ привет, подскажи что не так? после удаления сравнений, в листбоксе2 остаеться к примеру путь с:22.txt 11.11.11 11:11 но при использовании ниже приведенного кода, выдаёт ошибку!
foreach (string fi in listBox2.Items)
ADMIN
10.09.2016 в 07:27
выдаёт ошибку
САНЯ
11.09.2016 в 09:21
решил попробывать вставить рекурсию по нажатию кнопки
private void button2_Click(object sender, EventArgs e) < string ToDir = @"C:1"; string FromDir = listBox2.Items.ToString(); Directory.CreateDirectory(ToDir); foreach (string fi in listBox2.Items) - все нормально но потом когда возвращаеться сюда ошибка < string str = listBox2.Items[0].ToString(); string path = str.Substring(0, str.IndexOf(' ')); try < File.Copy(path, ToDir + "" + Path.GetFileName(fi), true); >catch (Exception ex) < MessageBox.Show(ex.Message); >foreach (string dir in Directory.GetDirectories(@"C:2")) < CopyDir(dir, ToDir + "" + Path.GetFileName(dir)); >> >
Необработанное исключение типа «System.InvalidOperationException» в System.Windows.Forms.dll
Дополнительные сведения: Список, к которому привязан данный перечислитель, был изменен. Перечислитель может использоваться, только если список не изменяется.
ADMIN
12.09.2016 в 04:21
По нажатию кнопки должно быть так:
private void button2_Click(object sender, EventArgs e)
Полный код метода CopyAllDirsAndFiles добавлял выше в комментариях.
Эта строка не содержит путь, хотя и не используется:
string FromDir = listBox2.Items.ToString();
C как скопировать запущенный файл
В таблице E.I., приведены команды, используемые для работы с файлами. В этом разделе автор приводит подробное описание команд копирования файлов.
С помощью команды copy можно копировать файлы (не каталоги!). Команда внутренняя.
Действие: из каталога, указанного в первом параметре команды, копируется файл (или файлы в случае задания шаблона) в каталог, указанный во втором параметре команды. Возможны следующие варианты:
1) Оба параметра — различные краткие имена файлов. В этом случае в текущей директории создается дубликат файла. Пример:
copy myfile.txt myfile.doc
В текущей директории создается дубликат файла myfile.txt — файл myfile.doc
2) Оба параметра — полные имена. Происходит копирование файла из одного каталога в другой с изменением имени. Например:
copy c:\tech\myfile.txt a:\myfile.doc
Файл myfile.txt в директории c:\tech изменяет свое имя на myfile.doc и копируется в корневой каталог диска A.
3) Первый параметр — имя файла (полное или краткое), а другой — путевое имя каталога. Файл копируется в каталог назначения без изменения имени. Например:
copy c:\tech\myfile.txt a:\
Файл myfile.txt из директории c:\tech\ копируется в корневой каталог диска A.
4) Первый параметр — шаблон, а второе — путевое имя каталога. Этот случай аналогичен случаю 3), однако при этом копируется не единичный файл, а группа файлов, удовлетворяющая условиям шаблона. Пример:
В этом примере все файлы корневого каталога диска A: с расширением doc копируются в корневой каталог диска B: без изменения имени.
5) Оба параметра — шаблоны файлов. Тогда копируются файлы из каталога — источника, удовлетворяющие первому условию (параметр 1), в каталог — приемник. при этом имена файлов изменяются так, чтобы они удовлетворяли шаблону, указанному в параметре 2. Пример:
copy \tech\*.txt b:*.doc
Копируются файлы с расширением txt из каталога \tech\ текущего диска в текущий каталог диска B:. При этом расширение всех файлов меняется на doc.
6) Первый параметр — шаблон файла, а второй — имя файла. Происходит копирование с объединением. Подробнее смотри раздел, посвященный объединению файлов.
2. Опции команды copy.
/v — после копирования делается проверка записи. Для этого только что записанные данные снова считываются с диска — приемника. Однако при этом не происходит сравнение файла с оригиналом, поэтому называть эту операцию проверкой правильности записи можно лишь с натяжкой. Однако это лучше, чем совсем не проверять запись (как при копировании в графических оболочках).
/A — копирование как текстовые файлы. Копируются содержимое файла(ов) до первого встреченного символа «конец файла» (EOF, ASCII 26 — смотри раздел, посвященный классификации файлов). После копирования символ EOF добавляется в конец файла.
Ключ действует на предшествующий файл, а также на все последующие до конца команды. Он отменяет действие ключа /B.
/B — копирование как двоичные файлы. Файлы рассматриваются как произвольная последовательность символов. Файлы копируются до конца, в конец скопированного файла не добавляется символ EOF.
Ключ действует на предшествующий файл, а также на все последующие до конца команды. Он отменяет действие ключа /A.
3. Замечания.
1) Команда copy не копирует:
b) скрытые и системные файлы.
2) Команда copy не копирует «образ» дискеты. То есть команда
не создаст образ дискеты в смысле одинакового положения файлов на обоих дискетах. Однако при копировании с помощью этой команды все файлы на диске B: будут расположены максимально плотно (то есть в последовательных секторах). Это является одним из достоинств данной команды.
Образ же дискеты лучше всего делается командой diskcopy, входящей в состав MS-DOS, или программой diskdupe.exe. Последняя может даже создавать образ дискеты в виде файла, чем широко пользуются компьютерные пираты, незаконно воспроизводя дистрибутивы с дискет.
3) При копировании файла в каталог, где существует файл с тем же именем, содержимое последнего СТИРАЕТСЯ!
4) Командой copy нельзя копировать двоичные файлы с символьных устройств ввода/вывода. К таким устройствам относятся все устройства, подключаемые к последовательным и параллельным портам компьютера, а также консоль (клавиатура.)
4. Сообщения при копировании файлов.
Успешно скопировано файлов.
b) File not found
c) File cannot be copied onto itself
Файл не может быть скопирован сам на себя
Попытка копирования файла на себя. Не было указано, где содержится копия. В подобной ситуации MS-DOS копирование не производит.
d) Insufficient disk space
Недостаточно места на диске
Не хватает места на целевом диске для копируемого файла.
e) Cannot do binary reads from device
Не могу осуществить бинарный ввод с устройства
Используется ключ /B при копировании текста с какого-либо устройства (CON, AUX, PRN и других — смотри раздел, посвященный редиректору DOS). С этих устройств могут копироваться только текстовые файлы, заканчивающиеся символом EOF. Пример неправильного использования такой опции:
copy /B con myfile.doc
f) Invalid path or file name
Неправильный путь или имя файла.
Неправильно указано имя файла или путь доступа, некорректно используется имя каталога или оно неправильно записано. Выполнение команды прерывается.
Впервые эта команда появилась в MS-DOS версии 3.2. Команда позволяет копировать файлы и каталоги. Команда внешняя (xcopy.exe).
Команда xcopy действует также, как и команда copy. Во всяком случае смысл ее параметров остался тем же (смотри E.2.2.2.1.1, описание). Однако благодаря наличию ключей она может дополнительно:
a) копировать и файлы, и дерево каталогов;
b) копировать файлы, которые создавались или модифицировались после указанной даты;
c) копировать файлов с установленным атрибутом «архивный»;
d) запрашивать подтверждение на копирование.
/A — Копирование файлов, у которых установлен флаг архивации. После копирования флаг не сбрасывается. (A — Archive — Архив)
Примечание. Флаг архивации устанавливается каждый раз, когда файл создается или модифицируется.
/D: — Копирование файлов, которые были созданы или изменены в указанный день или позже. (D — Date — Дата).
/E — Копирование всех подкаталогов, даже если они пустые. Этот ключ используется с ключом /S. (E — Empty — Пустой).
/M — Тоже, что и ключ /A, однако после копирования атрибут «архивный» сбрасывается. (M — Modify — Изменять).
/P — Перед копированием каждого файла из группы запрашивается подтверждение. (P — Prompt — Запрашивать).
/S — Копирование дерева каталогов Это означает копирование файлов из указанного в команде каталога и изо всех его подкаталогов. (S — Subdirectory — Подкаталог).
/V — Проверка правильности записи файлов на диск — приемник. (V — Verify — Проверять).
/W — Перед копированием DOS выводит на экран запрос и ожидает установки в дисковод дискеты с входными файлами. (W — Wait — Ждать).
Возвращаемые коды завершения программы.
В зависимости от результатов копирования программа xcopy возвращает операционной системе один из следующих кодов завершения (errorlevel).
0 — Копирование прошло успешно, без ошибок.
1 — Не обнаружено файлов для копирования.
2 — Пользователь прервал копирование нажатием Ctrl+C.
4 — Общая ошибка. Может быть выдана по следующим причинам:
a) недостаточен объем памяти;
b) неправильно указан дисковод;
c) в командной строке допущена ошибка;
d) файл не обнаружен;
5 — Ошибка записи или считывания дискеты.
Замечания:
1. Команда xcopy не работает с устройствами.
2. Данная команда по-прежнему не копирует скрытые и системные файлы.
3. Команда xcopy не копирует файлы, не помещающиеся на одном носителе (дискете). Также не возможно прямое копирование на несколько дискет.
Для того, чтобы все же скопировать каталог, файлы которого все вместе не помещаются на дискете, необходимо:
a) Выполнить команду Attrib +A *.* Эта команда устанавливает у всех файлов флаг архивации.
b) Выполнить команду xcopy *.* /M Эта команда копирует все файлы с установленным атрибутом «архивный», сбрасывая его после копирования.
c) После заполнения одной дискеты вставьте другую и выполните снова пункт b). При этом копирование начнется с первого же файла, имеющего установленный атрибут «архив».
4. Команда xcopy, как и команда copy, не создает образ дискеты (см. раздел E.2.2.1.1, замечания)
5. При копировании файла в каталог, где существует файл с тем же именем, содержимое последнего СТИРАЕТСЯ (как и у команды copy)!
a) Reading source file(s)
Читаю исходные файлы.
Команда считывает содержимое дискеты или диска в память.
Произведено успешное копирование n файлов.
c) Access denied
Была попытка копирования файла с установленным атрибутом «только чтение», целевой файл используется другой программой, либо для исходного и целевого файла указано одно имя.
d) Cannot perform a cycled copy
Не могу осуществить циклическое копирование (см. E.2.2.1.d)).
e) Cannot copy from reserved device
Не могу копировать с зарезервированного устройства.
Cannot copy to reserved device
Не могу копировать на зарезервированное устройство.
Попытка копирования с/на устройство, или имя файла совпадает с именем устройства.
f) Does specify a file name or directory name on target? (F — file, D — directory).
указывает на имя файла или каталога? (F — файл, D — каталог).
Команда xcopy не понимает, что обозначает целевое имя: файл или каталог. Если целевое имя является именем каталога, то следует нажать D. Команда создаст каталог и скопирует туда все файлы. Если это имя файла, xcopy присвоит имя копируемому файлу.
g) File cannot be copied onto itself
Файл не может быть скопирован сам на себя.
Идентичное описание параметров 1 и 2. Такое также возникает, когда не найден целевой или исходный диск, каталог или имя файла.
h) File creation error
Ошибка в создании файла
В целевом каталоге уже есть копируемый файл, каталог заполнен, либо копируется файл с установленным атрибутом «только чтение».
i) File not found
Файл с именем не найден
j) Insufficient disk space
Недостаточно места на диске.
Это значит, что либо файл не помещается на дискету (и нужно отказаться от копирования), либо дискета заполнена файлами.
Дата записана с недопустимыми символами.
l) Incorrect DOS version
Некорректная версия DOS
Программа xcopy должна быть той же версии, что и файл command.com
m) Invalid drive specification
Неправильное имя дисковода.
Указанный дисковод не существует, либо пропущено двоеточие после его имени.
n) Invalid number of parameters
Неправильное число параметров
o) Invalid parameter
Неопознанный ключ, или пропущен слэш у ключа («/»).
Неправильно записано путевое имя, или оно слишком длинное.
q) Path not found
r) Path too long
Путь слишком длинен
s) Press any key to begin copying file(s)
Нажмите любую клавишу, чтобы начать копирование файла(ов)
Сообщение появляется, когда указан ключ /W.
t) Unable to create directory
Не могу создать каталог
Dos не может создать каталог, если имена файла и подкаталога (с расширением) совпадают. Сообщение также появляется, если дискета заполнена, либо допущена ошибка в определении пути доступа.
С помощью этой команды можно создавать идентичные копии съемных дисков. При этом содержимое всех кластеров на дискетах становится одинаковым, то есть создается как бы «образ» дискеты (в отличие от использования команд copy и xcopy). Образы дискет бывают необходимы в случае копирования загрузочных и дистрибутивных дискет. Команда внешняя.
где — дисковод с исходной дискетой,
— дисковод с целевой дискетой (на которую производится копирование).
С исходной дискеты создается образ, который переносится на целевую дискету.
/1 — используется только одна сторона дискеты.
0 — копирование произошло успешно.
1 — произошла ошибка, которая не является серьезной.
2 — пользователь прервал копирование, нажав Ctrl+C.
3 — серьезная ошибка. Программа на может считать исходную дискету или форматировать целевую дискету.
4 — недостаточный объем оперативной памяти, неправильно указан дисковод или ошибка в команде.
Замечания:
1. Ни в коем случае не перепутайте местоположение целевой и исходной дискеты. В противном случае данные на исходной дискете будут разрушены! Поэтому желательно исходную систему защитить от записи (заклеить вырез 5,25″ дискете или открыть отверстие в 3,5″ дискете).
2. Команда diskcopy осуществляет форматирование целевой дискеты, если она не форматирована или имеет другой формат.
3. Все данные на целевой дискете уничтожаются.
4. Команда копирует скрытые и системные файлы.
5. Если для целевой и исходной дискеты используется один привод, то дискеты меняются при появлении сообщения, выдаваемого командой.
6. Если объем оперативной памяти достаточно большой, то происходит считывание содержимого исходной дискеты в оперативную память перед его копированием на целевую дискету. В MS-DOS 5.0 и выше для этого используется расширенная память (при установке драйвера HIMEM.SYS). Если же объем памяти меньше необходимого, то содержимое исходной дискеты переносится частями.
7. Эту команду нельзя использовать в сети и вместе с командами assign и subst.
8. Если указано имя одного дисковода или имена двух дисководов совпадают, то копирование дискеты будет осуществляться на одном приводе.
9. При копировании исходная дискета обозначается словом SOURSE (источник), а целевая — словом TARGET.
a) Cannot DISKOPY to or from a network drive.
Не могу копировать на/из сетевого диска.
Команда не должна использоваться в сети.
b) Cannot DISKCOPY to or from ASSIGNed or SUBSTed drive.
Не могу копировать на/из дисков, назначенных командами ASSIGN или SUBST.
c) Copy another diskette (Y/N)?
Копировать другую дискету (Да/Нет)?
Данное сообщение появляется после завершения копирования дискеты. Оно запрашивает, будет ли продолжено копирование дискет. Если необходимо копировать другую дискету, нажмите клавишу Y и смените дискеты. В противном случае нажмите клавишу N.
d) Copy not completed
Копирование не закончено
Команда DISKCOPY не смогла завершить копирование дискеты. Рекомендуется произвести повторное копирование на другую целевую дискету.
e) Copying tracks
Секторов на дорожку, сторон.
Команда сообщает формат дискеты.
f) Disk error while reading drive A:
Abort, Ignore, Retry?
Ошибка при чтении дискеты в дисководе A:
Во время копирования обнаружена ошибка на исходной дискете. Нажатие A: приведет к отмене копирования, I — продолжение процесса копирования с потерей данных, R — произвести повторную попытку прочитать исходную дискету.
g) Disk must be the same size.
Диск должен иметь тот же размер.
Запрещено копировать диски с разным форматом.
h) Drive : not ready
Make shure a diskette is inserted into the drive
and the door is closed
Диск не готов. Убедитесь, что дискета установлена в дисковод и его замок закрыт.
i) Drive types or diskette types not compatible
Тип дисководов или дискет не совместим. (Например, при копировании 5,25″ дискеты HD/DS на DD/DS и т.п.).
j) Formating while copying
Форматирование перед копированием.
В процессе этой операции формат целевой дискеты приводится к формату исходной.
k) Incorrect DOS version
Неверная версия DOS.
Версия программы DISKCOPY должна совпадать с версией command.com.
l) Insert [SOURSE|TARGET] diskette in drive A:
Press any key when ready
Поместите исходную|целевую дискету в дисковод A: и нажмите любую клавишу для продолжения.
m) Insufficient memory
Недостаточно памяти (для копирования дискет).
n) Invalid drive specification/
Specified drive does not exist or is non-removable
Неправильная спецификация дисковода.
Указанный дисковод не существует или является несъемным.
o) Invalid parameter.
Do not specify file name(s)
Command format (:) () [/1]
Не указывайте имена файлов
p) SOURCE|TARGET diskette bad or incompatible
Copy process ended
Исходная|целевая дискета повреждена или несовместима
Процесс копирования завершен.
Команда не может считать целевую дискету или отформатировать целевую.
q) TARGET diskette is write protected
Целевая дискета защищена от записи.
Необходимо снять защиту от записи на целевой дискете перед процессом копирования.
r) TARGET diskette may be unusable
Целевая дискета, возможно, непригодна
На целевой дискете обнаружена неисправимая ошибка. Необходимо заменить дискету.
s) Unrecoverable read/write error on drive (:)
side , track
В дисководе :на стороне и дорожке обнаружена неисправимая ошибка.
t) Sourse and target diskettes are not the same format.
Cannot do the copy
Исходная и целевая дискеты имеют разный формат. Не могу делать копию.
Попытка копирования 5.25″ дискету на 3,5″ дискету и наоборот.
Поскольку в 80-е годы XX столетия OS/2 задумывалась как «правоприемница» MS-DOS, то при реализации ее командной строки использовался тот же набор команд. Однако правила использования команд претерпели некоторые изменения. Об отличиях в использовании команд MS-DOS и IBM OS/2 будет рассказано ниже.
Копирование файлов или группы файлов. В отличие от MS-DOS эта команда может копировать каталоги.
Те же, что и в MS-DOS.
— диск, директория или файл (группа файлов), который(-ые) должны быть скопированы.
— устройство, диск, или директория, куда необходимо переместить копии файла(-ов).
Замечания:
1. Также, как и в MS-DOS, командой copy в OS/2 нельзя копировать дерево каталогов. Если при копировании указать только имя каталога, то с него будут скопированы все файлы, но не подкаталоги. Для копирования же подкаталогов необходимо по-прежнему использовать команду xcopy.
2. При записи новых файлов поверх старых необходимо учитывать, что в OS/2 не предусмотрены средства для восстановления удаленных с командной строки файлов!
Копирование файлов и дерева каталогов.
Копирование файлов, исключая скрытые и системные, и также дерева каталогов из в . Смысл и аналогичен тем же терминам в команде copy [E.2.2.2.1.]
/A, /D, /E, /M, /P, /S, /V, /W — назначение этих ключей полностью совпадает с назначением ключей в команде xcopy MS-DOS, а потому здесь не рассматриваются (см. E.2.2.1.2., ключи).
/Y — не запрашивать подтверждения для перезаписи существующих файлов назначения.
Копирование содержимого (образа) одного съемного диска на другой.
Ключи: нет (в отличие от MS-DOS).
Замечания:
1. Команда diskcopy OS/2 аналогична своей «тезки» в MS-DOS, однако не поддерживает копирование только одной стороны дискеты (ключ /1).
2. Команда Diskcopy не поддерживает XDF-формат данных.
Примечание: XDF-формат (eXtended Data Format — расширенный формат данных) позволяет на дискету 3.5″ HD/DS записывать до 1,8 Мбайт информации (вместо 1,44 Мбайт).
Копирование образов дискет в XDF-формате.
— диск или файл-образ диска, которые копируются.
— диск или имя файла-образа диска.
Замечания:
1. xdfcopy аналогична программе diskcopy OS/2, только работает с дисками с xdf-форматом данных.
2. Команда xdfcopy позволяет сохранить образ дискеты в файл, что роднит ее с программой копирования дискет в diskdupe MS-DOS. Однако эти команды различаются форматом хранения данных.
3. Команда xdfcopy может также выполнятся в сеансе MS-DOS под управлением OS/2 (а не только в командной строке OS/2).
Операционная система Linux является клоном операционной системы UNIX, работающая на Intel-совместимых компьютерах. В настоящее время Linux является наиболее распространенным клоном UNIX, и именно ее автор будет рассматривать как пример в UNIX-подобных операционных системах.
В отличие от MS-DOS, в операционной системе Linux нет команд, копирующих или только файлы (как команда copy), или только файлы с деревом каталога (команда xcopy). Оба этих действия выполняет команда cp, которая, в зависимости от контекста, копирует и файлы, и каталоги. Ее синтаксис следующий:
Смысл команды следующий.
1. И источник, и приемник — имена файлов. Тогда команда просто создает копию (дубликат) файла с новым именем в текущем каталоге.
cp oldfile newfile
2. Источник — имя файла, приемник — каталог. Команда создает копию файла — источника в указанном каталоге — приемнике.
cp oldfile /home/den/mydir
3. Источник шаблон файла, приемник — каталог. Удовлетворяющие шаблону файлы копируются в каталог — приемник.
cp . file /home/den/mydir
4. Источник — имя файла (краткое или полное), приемник — полное имя файла. Происходит копирование указанного файла в каталог вместе с его переименованием.
cp thefile newdir/oldfile
— копирует файл thefile в подкаталог newdir в файл oldfile
cp newdir/oldfile newfile
— копирует файла oldfile из подкаталога newdir в файл newfile в текущем каталоге.
cp thefile ../file
— копирует файл thefile в файл file родительского каталога.
5. Источник — каталог + шаблон *.*, приемник — каталог. Копируются файлы из каталога — источника в каталог приемник. Подкаталоги копируются только в том случае, если указан ключ -r (смотри ниже).
cp mydir/*.* newdir
— копируются все файлы из каталога mydir в каталог newdir.
Остальные комбинации являются запрещенными.
Основные опции команды cp.
-i — выдача запроса на подтверждение перезаписи. Дело в том, что при копировании в Linux происходит следующее:
a) Если файла с именем, указанным в приемнике, не существует, то он создается и в него записывается информация.
b) Если файл с именем, указанным в приемнике, существует, то он СТИРАЕТСЯ, а на его месте создается новый файл БЕЗ ПРЕДУПРЕЖДЕНИЯ!
Чтобы выдать предупреждение, вводится опция -i. Пример ее использования:
cp -i newfile oldfile
После этой команды будет выдано предупреждение:
Если на запрос ответить нажатием клавиши Y, то файл перезапишется. Любой другой ответ будет воспринят как «нет».
-r — при копировании использовать подкаталоги любой вложенности. Аналогична использованию ключей /S и /A в команде DOS xcopy.
Файловые системы Linux и MS-DOS разные. Чтобы подключить диск с любой файловой системой в UNIX (в частном случае — в Linux) необходимо эту файловую систему смонтировать. Однако если используются дискеты на 3.5″, то монтирование файловой системы каждой дискеты перед ее употреблением, а потом ее размонтирование при смене дискет было бы делом неразумным. Именно для того, чтобы избежать постоянных циклов монтирования — размонтирования файловых систем на дискетах, для работы с дискетами MS-DOS в операционной системе Linux есть так называемые команды mtools.
Для копирования с дискеты MS-DOS на диск Linux и наоборот служит команда mcopy. Ее синтаксис следующий:
— для копирования файла из Linux в текущий каталог диска a: или b:.
— для копирования файла из текущего каталога диска a: или b: на диск Linux.
Замечания:
1. При копировании файлов можно использовать шаблоны.
2. При копировании файлов с/на дискету копируются файлы только в текущем каталоге. Указание любых каталогов на диске a: (или b:) ЗАПРЕЩЕНО! Если необходимо перейти в подкаталог на диске a: (или b:), используйте команду mcd.
CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt
Доброго времени суток!
Надо найти в определенных папках, заданных маской, определенные файлы, тоже заданные маской.
Найденные файлы скопировать в папку, откуда запущен bat-ник. Поскольку имена найденных файлов могут совпадать, то имена результирующих файлов должны состоять из имени папки, в которой они находились, и оригинального имени файла.
Вот код, который мне удалось написать. Он не делает из того, что мне надо только одно- не присваивает новые имена.
Помогите, пожалуйста.
set folder_where=%~dp0 rem for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do ( for %%C in ("%%B\*.txt") do copy /y "%%C" "%folder_where%" >NUL ) pause
Из моего кода видно, что в каталоге %USERPROFILE%\AppData\Roaming\PC\ есть некие папки, названия которых начинаются с цифры 3 (три). Количество символов в имени папки (цифр), как правило, 12. В таких папках мне надо найти определенные файлы по маске *.txt. например: readme.txt. Такие файлы должны появиться в папке с батником под именем=имя папки+имя файла, например: 321098765432-readme.txt
И еще. Хотелось сделать проверку на наличие файла (321098765432-readme.txt). Если у записанного дата старее, чем у нового (readme.txt), то перезаписать, иначе не надо.
Заранее спасибо.
2 Ответ от andypetr 2022-06-15 07:39:31
- andypetr
- Разработчик
- Неактивен










Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt
123ksn, приветствую.
Вот мой вариант.
Присваиваются новые имена, обновляются существующие файлы (ключ /D команды XCOPY).
set "folder_where=%~dp0" for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do ( for %%C in ("%%B\*.txt") do echo F|xcopy "%%C" "%folder_where%%%~nxB-%%~nxC" /d /h /k /r /y >NUL rem "echo F|" подавляет запрос на копирование новых файлов "(F = файл, D = каталог)". rem Ключи XCOPY: rem /D:m-d-y Копирует файлы, измененные либо в указанный день, либо после. rem Если дата не указана, копируются только те файлы, которые новее в исходной папке. rem /H Копирует скрытые и системные файлы. rem /R Заменяет файлы, доступные только для чтения. rem /K Копирует атрибуты. Простая команда Xcopy сбрасывает атрибут "Только чтение". rem /Y Подавляет запрос на подтверждение перезаписи существующего конечного файла. )
3 Ответ от 123ksn 2022-06-15 09:23:21 (изменено: 123ksn, 2022-06-15 09:29:13)
Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt
andypetr
Большое спасибо. Проверил. Не работает. Добавил pause. Проскакивает черный экран, но файлы не появляются.
4 Ответ от andypetr 2022-06-15 10:43:31 (изменено: andypetr, 2022-06-15 10:47:29)
- andypetr
- Разработчик
- Неактивен










Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt
123ksn, попробуйте добавить последней строкой PAUSE.
И в строке «for %%C . >NUL» заменить «>NUL» на «>>1.txt«.
Что выводится на экран и в файл 1.txt?
PS. Точно ли у вас в папке %USERPROFILE%\AppData\Roaming содержится папка PC с папками, начинающимися на 3*, в которых есть файлы .txt?
Я у себя всё это создал для тестирования — например, есть файл C:\USERS\ПОЛЬЗОВАТЕЛЬ\APPDATA\ROAMING\PC\321098765432\readme.txt.
5 Ответ от 123ksn 2022-06-15 11:59:53
Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt
andypetr
Извините меня пожалуйста. Оказывается РС у меня было на русском языке. Поэтому не сработало. Теперь файлы сохраняет как и хотел. Чуть позже проверю с логику с датами.
Я видимо наглею, но нельзя ли сделать вариант контроля не по дате, а по размеру. Я подумал, что нет смысла перезаписывать старый файл новым, из которого удалили часть информации.
В любом случае Вам огромное спасибо за работающий вариант и за обучение, как увидеть лог работы батника.
6 Ответ от andypetr 2022-06-15 13:47:31
- andypetr
- Разработчик
- Неактивен










Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt
123ksn
Не хотел усложнять, но тут потребуется команда «SetLocal EnableDelayedExpansion«, которая позволяет легко обращаться к значению переменной внутри блока кода, ограниченного скобками — через восклицательные знаки.
Я первой строкой всех своих BAT-файлов всегда пишу «@echo off & SetLocal EnableExtensions EnableDelayedExpansion», так проще кодировать.
В данном примере я обращаюсь к значению переменной «doCopy»: «%doCopy%» не раскрывает значение переменной, а вот «!doCopy!» всё делает как надо.
Аналогично, можно было бы написать «for %%D in («!folder_where!%%~nxB-%%~nxC»)» — хотя тут и с процентами срабатывает.
В общем, я везде где можно раскрываю значения переменных через «!».
За исключением переменных-параметров (%0, %*, %1, . %9), переменных циклов (%%a-%%z, %%A-%%Z) и переменных окружения (%PATH% и т.д.).
@echo off & SetLocal EnableExtensions EnableDelayedExpansion set "folder_where=%~dp0" for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do ( for %%C in ("%%B\*.txt") do ( for %%D in ("%folder_where%%%~nxB-%%~nxC") do ( rem Сравнение размеров файла-источника %%C и файла-приемника %%D: if exist "%%~D" ( set /a doCopy = %%~zC - %%~zD ) else ( set /a doCopy = 1 ) rem переменная doCopy: rem > 0, если файл %%C больше по размеру, чем файл %%D (нужно копирование) rem = 1, если файл %%D не существует (нужно копирование) rem = 0, если файлы равны по размеру (нужно копирование с ключом /D) rem < 0, если файл %%C меньше по размеру, чем файл %%D (не нужно копирование) if !doCopy! geq 1 ( echo F|xcopy "%%~C" "%%~D" /h /k /r /y >NUL ) else ( if !doCopy! equ 0 ( echo F|xcopy "%%~C" "%%~D" /d /h /k /r /y >NUL ) ) rem "echo F|" подавляет запрос на копирование новых файлов "(F = файл, D = каталог)". rem Ключи XCOPY: rem /D:m-d-y Копирует файлы, измененные либо в указанный день, либо после. rem Если дата не указана, копируются только те файлы, которые новее в исходной папке. rem /H Копирует скрытые и системные файлы. rem /R Заменяет файлы, доступные только для чтения. rem /K Копирует атрибуты. Простая команда Xcopy сбрасывает атрибут "Только чтение". rem /Y Подавляет запрос на подтверждение перезаписи существующего конечного файла. ) ) ) pause EndLocal exit /b