Компьютерный форум 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=287790)

solomonkane 11-09-2014 11:47 2401248

Поиск нескольких файлов и замена на другие
 
Здравствуйте
имеется скрипт:
Код:

@echo off
for /d %%p in (c d e f) do (forfiles /s /p %%p:\ /m file1.txt /c "cmd /c xcopy /y c:\users\administrator\desktop\file22.txt @path && ren @path file22.txt")

пример брал отсюда: http://forum.oszone.net/thread-287613.html
надо чтобы искал 3 файла только в диске на котором установлена винда (не задавая букву диска, учитывая, что windows может быть установлена в Y:\, L:\. P:\ и т.д.) и заменял на другие 3 файла поочередно , которые находятся в директории с батником, не указывая полные пути до них.
Приведенный выше скрипт отлично заменяет 1 на другую, но почему-то после успешной замены дальше выдает ошибки типа Access deniet to:разные папки (хотя у меня админ права).
Как избежать замены не на тот файл с одинаковым именем и расширением, если батник будет запущен из того же диска на котором содержатся файлы для поиска и замены(например первым найдет файл в директории с запускаемым bat и попытается его же заменить)?
И не совсем понятен зачем там команда переименования ren.

Elven 11-09-2014 15:20 2401387

начнем с конца. команда переименование нужна для переименования конечного файла ибо переменная @path из forfiles возвращает полный путь к файлу с именем и расширением этого самого файла.
избежать замены не на тот файл можно указав абсолютный путь к правильному файлу (в вышеуказанном примере так и сделано c:\users\administrator\desktop\file22.txt)
далее по правам дядюшка Билли и вся его скромненькая корпорация Мелкомягк не шибко верит в сознательность пользователей а посему режет права к некоторым файлам и папкам в особенности к тем, что находятся в папке Windows, для того чтобы к ним подобраться нужно не только быть админом, нужно уметь шаманить с владением (или владетельством?) этими самыми папками и файлами, упомяну еще раз, что лезть к ним (системным файлам) можно лишь в том случае если вы точно знаете что это за файл, с чем его принято есть, кто им питается кроме вас и из-за чего может произойти какое-нибудь несварение с последующим реактивным поносом.
теперь собственно по замене файлов т.к. поиск сводится к поиску на системном диске (в данном случае диске с виндой) то лучше всего вспомнить про славную переменную %systemdrive% которая и вернет нам нужную букву и даже вместе с двоеточием, первый цикл в таком случае перепаиваем на поиск и скармливаем ему файл в котором лежат нужные нам пары на замену.

Код:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (file.txt) do (
for /f "tokens=1-2 delims=_" %%A in ("%%i") do (
set orig=%%A
set repl=%%B
forfiles /s /p %systemdrive%\ /m !orig! /c "cmd /c xcopy /y d:\files4replace\!repl! @path && ren @path !repl!"
))

file.txt файл в котором лежат пары файлов original_replacement*
d:\files4replace\ место где лежат файлы на замену

Примечание
*file.txt в котором хранятся пары файлов на замену должен иметь вид:
Код:

111.txt_222.txt
333.txt_444.txt

т.е. два имени файлов разделены подчеркиванием, первый файл - оригинальный, второй - вставляемый на место оригинала.

solomonkane 11-09-2014 18:10 2401498

Спасибо за ответ, создал на системном диске 2 файла 111.txt и 333.txt, а в папке с батником 222.txt 444.txt и file.txt с указанием пар соответственно, но скрипт заменяет только 2 файла, указанные в 1-й строке, в чем может быть проблема?

Elven 11-09-2014 18:38 2401507

В синтаксисе файла, в названии файлов как заменяемых так и замещающих. Даже лишний пробел может сыграть свою роль.


Время: 01:02.

Время: 01:02.
© OSzone.net 2001-