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

ul9 17-10-2012 16:38 2007214

Копирование и удаление файлов по маске
 
Здравствуйте.
Помогите пожалуйста решить проблему.
Есть папка с подпапками (около 30 штук). В каждой подпапке находятся текстовые файлы (всегда 900 txt).
Файлы имеют такой вид
Код:

result0000000.txt
result0000001.txt
result0000002.txt
...
и так до
result0000898.txt
result0000899.txt

Нужно удалить конкретные файлы. Я нашла вот такой скрипт
Код:

setlocal enableextensions
set "MYPATH=E:\TEMPO_UPD\32-bit\En\UnPack\KBxxxxxx\"
set SOURSE=*.exe
for /f "tokens=*" %%i in ('dir /b/s/a-d "%MYPATH%%SOURSE%" ^| findstr /G:KB.log') do del /q /f "%%i"
endlocal
EXIT

Удалять нужно с result0000299.txt по result0000899.txt.
Конечно можно прописать список из 600 файлов, но неужели нет более элегантного решения?

А в другой подпапке нужно перенести из одной папки в другую файлы с result0000599.txt по result0000899.txt.
Тут я уже не смогла найти нужный скрипт...

Хоть я и выбрала категорию cmd/bat, способ решения мне не важен :)

С уважением,
Юлия

Iska 17-10-2012 18:13 2007302

Цитата:

Цитата ul9
Удалять нужно с result0000299.txt по result0000899.txt. »

Выполните непосредственно в командной строке (не в пакетном файле):
Код:

for /l %i in (299,1,899) do @del /s /q "E:\Песочница\0184\result0000%i.txt" 2>nul
где вместо E:\Песочница\0184 укажите путь к Вашей папке («Есть папка с …»).

Цитата:

Цитата ul9
А в другой подпапке нужно перенести из одной папки в другую файлы с result0000599.txt по result0000899.txt. »

Это какая другая подпапка?

ul9 17-10-2012 18:37 2007321

Я через AutoScriptWriter записала себе порядок действий по генерации файлов.
Приведу пример.
Есть основная папка work, а в ней подпапки test1, test2, test3, test4 и т.д.. В каждой из этих подпапок по 900 txt файлов.
В папке test1 нужно оставить первые 300 файлов (result0000000.txt - result0000299.txt), все остальные удалить.
Из папки test2 перенести (result0000300.txt - result0000599.txt) в папку test3, а (result0000599.txt - result0000899.txt) в test4.
Надеюсь не косноязычно получилось :)


Цитата:

Цитата Iska
Выполните непосредственно в командной строке (не в пакетном файле):
Код:

for /l %i in (299,1,899) do @del /s /q "E:\Песочница\0184\result0000%i.txt" 2>nul

Плохо, что нельзя добавить в свой скрипт, т.к. процедура довольно регулярная.

Iska 17-10-2012 20:02 2007387

Цитата:

Цитата ul9
а в ней подпапки test1, test2, test3, test4 и т.д. … »

1. И сколько будет «и т.д.»?
2. Как поступать с файлами из test5, test6 … testNN?
3. Сами папки вида testXX не имеют вложенных? То есть, не надо искать файлы result0000XX.txt ещё и во вложенных в test1, test2 …?

Цитата:

Цитата ul9
Из папки test2 перенести (result0000300.txt - result0000599.txt) в папку test3 »

1. Папки test3 и test4 уже существуют или их надо создавать?
2. Если — «Существуют», то что делать, если в test3 и/или в test4 окажутся одноимённые файлы?

Цитата:

Цитата ul9
Плохо, что нельзя добавить в свой скрипт, т.к. процедура довольно регулярная. »

Можно. Только не именно этот код. Этот — удалит Вам все подходящие файлы из всех testXX, вложенных в указанную, а не только из test1.

ul9 17-10-2012 20:19 2007398

Как я себе представляю логику скрипта. Вначале я распределяю файлы по папкам, после переименовываю их в result0000000.txt - result0000299.txt, а все остальные удаляю из всех папок.
Цитата:

Цитата Iska
1. И сколько будет «и т.д.»? »

Порядка 30 папок
Цитата:

Цитата Iska
2. Как поступать с файлами из test5, test6 … testNN? »

Я готова прописать действия вручную для каждой папки.
Цитата:

Цитата Iska
3. Сами папки вида testXX не имеют вложенных? То есть, не надо искать файлы result0000XX.txt ещё и во вложенных в test1, test2 …? »

Вложенных папок нет, но названия у них не test, это я для примера написала. Папки имеют названия в транслите с нижним подчёркиванием без прочих знаков пунктуации, вот пример (rezim_raboti).
Цитата:

Цитата Iska
1. Папки test3 и test4 уже существуют или их надо создавать? »

Все необходимые папки существуют.
Цитата:

Цитата Iska
2. Если — «Существуют», то что делать, если в test3 и/или в test4 окажутся одноимённые файлы? »

test3 и test4 изначально пустые, они создаются специально
Код:

MD D:\work\notarius_pomosh

ul9 18-10-2012 19:20 2008027

...что-то тема затихла...
А как можно запустить этот код из батника?
Код:

for /l %i in (299,1,899) do @del /s /q "E:\Песочница\0184\result0000%i.txt" 2>nul

Iska 18-10-2012 19:35 2008037

Цитата:

Цитата ul9
...что-то тема затихла... »

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

Цитата:

Цитата ul9
А как можно запустить этот код из батника? »

Удвоив «%» при переменных цикла разбора и выкинув ненужные подавления вывода:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /l %%i in (299,1,899) do del /s /q "E:\Песочница\0184\result0000%%i.txt" 2>nul

endlocal
exit /b 0

Но запускать его пока не рекомендую: удалите указанные файлы во всех вложенных папках.

ul9 18-10-2012 19:52 2008052

Цитата:

Цитата Iska
Не затихла. Но для меня, например, какие-то моменты требуют осмысления. Даже для того, чтобы задать очередные уточняющие вопросы. »

У меня, к сожалению, ограничено время... Задавайте все вопросы, не стесняйтесь :)
Цитата:

Цитата Iska
Но запускать его пока не рекомендую: удалите указанные файлы во всех вложенных папках. »

К сожалению альтернативы нет. Придётся сначала перемещать файлы этим скриптом, нашла его на этом форуме.
Код:

@Echo Off
cls
FOR /F "usebackq delims=" %%f IN ("D:\Delete\filelist.txt") DO Call :MoveFile "%%~f"
GoTo :Eof

:MoveFile

Set Out="%~dp1"
Set Out=%Out:"c:\src\="d:\dsc\%
Set Out=%Out:\"="%

Md %Out% >nul 1>nul 2>nul

Move %1 %Out%

Буду для каждой папки задавать что куда.
Потом так переименую для каждой папки
Код:

@echo off

setlocal enableextensions enabledelayedexpansion
set /a lCount = 0
for /f "delims=*" %%i in ('dir /b /s "D:\work\nasledstvo\*.txt"') do (
        set /a lCount += 1
        ren "%%i" "file!lCount!%%~xi"
)
endlocal

exit /b 0

А потом буду прогонять вашим кодом
Код:

@echo off
setlocal enableextensions enabledelayedexpansion
for /l %%i in (299,1,899) do del /s /q "E:\Песочница\0184\result0000%%i.txt" 2>nul
endlocal
exit /b 0


vserd 18-10-2012 23:15 2008182

D:\work\nasledstvo\*.txt
ren "%%i" "file!lCount!%%~xi"
выполнять не рекомендую, замучаетесь потом маску выставлять.
file1.txt
file10.txt
file100.txt

Сделайте себе несколько батников
1. Удаление 600 файлов.
2. Перенос из папки в папку 300 файлов. (замените в скрипте из второго поста @del на move и соответствующие цифры.

удаление 600 файлов из папки test1
del600.cmd d:\test1

удаление 600 файлов из папки test22
del600.cmd d:\test22
тело
Код:

for /l %%i in (299,1,899) do del  /q "%1%%i.txt" 2>nul
%1, %2 .... %9 означают параметры переданные команднику.

перемещение из d:\test1 в d:\test2

move599.cmd d:\test1 d:\test2

Код:

for /l %%i in (299,1,599) do move  "%1%%i.txt" "%2"
со вторым списком аналогично.

крайне рекомендую все папки по которым будет проводиться очистка заархивировать и спрятать на другой диск.
при проверке батников можно перед командами del, Move поставить echo. Будет длинный список команд .

Настоятельно рекомендую прочитать справку по командам for, if, set
Обязательно читать справку по del, Move и любым командам которые удаляют/копируют/перемещают папки или файлы.
cmd /k help for
help if
help set
help

В путях пускай не будет пробелов, %, !, ~ и других спец символов, аккуратней с русскими буквами

Iska 19-10-2012 05:54 2008305

Цитата:

Цитата ul9
Задавайте все вопросы, не стесняйтесь »

ul9, после Ваших последних постов я совершенно перестал понимать Ваши потребности.

Максимум того, что могу предложить — это дать примерное представление.

читать дальше »
1.
Цитата:

Цитата ul9
Есть основная папка work, а в ней подпапки test1, test2, test3, test4 и т.д.. В каждой из этих подпапок по 900 txt файлов.
В папке test1 нужно оставить первые 300 файлов (result0000000.txt - result0000299.txt), все остальные удалить. »

Код:

for /l %%i in (299,1,899) do del /q "c:\Work\test1\result0000%%i.txt" 2>nul
2.
Цитата:

Цитата ul9
Из папки test2 перенести (result0000300.txt - result0000599.txt) в папку test3 »

При условии, что «test2» и «test3» находятся на одном разделе, и «test3» существует:
Код:

for /l %%i in (300,1,599) do move /y "c:\Work\test2\result0000%%i.txt" "c:\Work\test3\" 2>nul
3.
Цитата:

Цитата ul9
а (result0000599.txt - result0000899.txt) в test4. »

При условии, что «test2» и «test4» находятся на одном разделе, и «test4» существует:
Код:

for /l %%i in (599,1,899) do move /y "c:\Work\test2\result0000%%i.txt" "c:\Work\test4\" 2>nul
Если данный код будет исполняться после 2) — файла «result0000599.txt» в исходной папке уже не будет: он будет перемещён кодом 2) в «test3».

dee.jack 25-03-2013 10:09 2117948

Прошу прощения, если пишу не туда, помогите с такой проблемой, вроде простая проблема, но не могу сообразить как ее решить:
При запуске батника необходимо сделать резервную копию файла:
md "%CD%\rezerv"
copy "%CD%\test.exe" "%CD%\rezerv"
Дальше как продолжить, чтоб копия не перемещалась в папку rezerv, если там уже есть test.exe?
Да, и желательно бы чтоб сообщение в строке появилось, что файл уже существует.
Спасибо заранее.


Время: 17:10.

Время: 17:10.
© OSzone.net 2001-