Войти

Показать полную графическую версию : [решено] Перемещение (удаление) директорий по маске


ven00m
19-01-2008, 11:57
Mast need скрипт каторый бы перемещал или удалял директории по маске. В моем случае по такой ( ~* ), можно просто принцип хотябы (IMHO длинный батник получится). Заранее спасибо.

Busla
19-01-2008, 18:31
Например, так:
@echo off
if exist %temp%\dirs.txt erase %temp%\dirs.txt
for /r %%i in (.) do echo %%i >> %temp%\dirs.txt
for /f %%d in ('findstr /r /c:".*\\~[^\\]*\\\." %temp%\dirs.txt') do rd /s /q %%d
не самое изящное решение - сбрасывает во временный файл список всех подкаталогов, но как-то невнятно findstr с консолью работает :(

truvo
21-01-2008, 03:18
Busla, не могли бы вы указать чайнику, где конкретно в вашем тексте маска удаляемых папок? Я понял, что она в кавычках:

.*\\~[^\\]*\\\.

Это верно?

pva
21-01-2008, 08:23
файл: my search template.js

// где искать
var dir = "c:\\windows\\";
// что искать (все папки, которые заканчиваются на 32)
var regex = new RegExp(".*32", "i");


function deal_with_dir(dir1)
{
// чё с ними делать
WScript.Echo('deleted: ' + dir1);
}


// основной цикл
var fileSystem = new ActiveXObject("Scripting.FileSystemObject");

for ( var datas=new Enumerator(fileSystem.GetFolder(dir).SubFolders); !datas.atEnd(); datas.moveNext())
{
if ( regex.test(datas.item().Name) ) deal_with_dir(datas.item().Name);
}

ven00m
21-01-2008, 12:53
Гыыы, как все сложно. Я по проше способ нашел:
текст файла del.vbs
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFolder "С:\path\~*", 1

Busla
21-01-2008, 13:45
2 truvo: да, findstr понимает регулярные выражения:
.* - любой символ любое кол-во раз (начало пути может быть любым, если его необходимо ограничить какой-то подпапкой - это делается в первом for)
\\ - косая черта - зарезервированный символ, поэтому его необходимо указывать дважды
~ - собственно, тильда, с которой должно начинаться имя папки
[^\\]* - любой символ, кроме косой черты произвольное кол-во раз
\\ - уже было
\. - точка - тоже зарезервированный символ, поэтому необходимо "экранировать" знаком "\" (for возвращает имена с точками на конце)

Про регулярные выражения (http://www.yandex.ru/yandsearch?text=%F0%E5%E3%F3%EB%FF%F0%ED%FB%E5+%E2%FB%F0%E0%E6%E5%ED%E8%FF) много материалов в инете - вещь полезная, правда, надо немного попрактиковаться - сразу по доке обычно сложно составить правильное выражение.

2 pva: Ну и зачем это было писать?!
Во-первых: оно ищет совсем другие папки! (а не те, что заканчиваются на 32)
Во-вторых: без ряда изменений оно не адаптируется к поставленной задаче
Во-третьих: про WSH не спрашивали - в WinPE, например, он не работает

pva
31-01-2008, 14:36
Busla,
1.
оно ищет совсем другие папки »
я запустил у себя тестовый пример, нашло как раз папки *32
2.
без ряда изменений оно не адаптируется к поставленной задаче »
на мой взгляд задача
Mast need скрипт каторый бы перемещал или удалял директории по маске. В моем случае по такой ( ~* ), можно просто принцип хотябы (IMHO длинный батник получится). Заранее спасибо. »
вполне выполнена
3.
про WSH не спрашивали »
средство программирования не уточнялось, извините

По-моему последний пример ven00m вполне подходит. кратко и ёмко.

Busla
31-01-2008, 17:34
ven00m конечно же виднее, что ему надо... Я ориентировался на первоначальную формулировку - заголовок в категории "CMD/BAT".

Ваш скрипт ищет папки в имени которых встречается 32. А в функцию-обработчик передаёт не полный путь, а только название папки. Поэтому и счёл необходимым предупредить, что в некоторых случаях он может грохнуть совсем не те папки, который задумывались.

Честно говоря, в голову не приходило, что ven00m требуется такая простая вещь - это разжёвано в справке к for:
for /d %%d in (~*) do rd /s /q %%d

pretzel
15-02-2009, 14:20
А если надо удалять только директории, например, с названием OldVersions (со всеми файлами в ней содержащимися) из всех подкаталогов текущего каталога(и возможно из подкаталогов каталогов), то это возможно сделать как cmd-скрипт, без применения языков программирования?

Petya V4sechkin
15-02-2009, 15:04
pretzel, примерно так:
For /D /R %%I In (OldVersions*) Do If "%%~nxI"=="OldVersions" RD /S /Q "%%~I"

pretzel
15-02-2009, 17:05
Petya V4sechkin, спасибо, попробую.
А если помимо удаления директорий OldVersions надо еще удалять все файлы с расширениями *.bak, *.db, *.cd~, *.lck, это можно сделать одной строкой команды, или только так:
del *.bak /s /q
del *.db /s /q
del *.cd~ /s /q
del *.lck /s /q

Если да, то как?

Petya V4sechkin
15-02-2009, 17:18
надо еще удалять все файлы с расширениями *.bak, *.db, *.cd~, *.lck
Del /F /S /Q *.bak *.db *.cd~ *.lck

pretzel
15-02-2009, 17:43
Petya V4sechkin, да только дело в том, что после запуска скрипта
For /D /R %%I In (OldVersions*) Do If "%%~nxI"=="OldVersions" RD /S /Q "%%~I"
del *.bak /s /q
del *.db /s /q
del *.cd~ /s /q
del *.lck /s /q
pause
удалились только каталоги OldVersions и файлы *.bak. А другие, с расширениями *.db, *.cd~, *.lck, остались. Сообщение после использования даже твоего скрипта (Del /F /S /Q *.bak *.db *.cd~ *.lck) было такое:
D:\Job>Del /F /S /Q *.bak *.db *.cd~ *.lck
Could Not Find D:\Job\*.bak
Ты не знаешь, в чем может быть ошибка? Кстати зачем ты используешь параметр /F - что , без его использования не произойдет удаления файлов с атрибутом «Только чтение»? И еще, я посмотрел, у файлов *.db *.cd~ *.lck атрибуты либо скрытый, либо скрытый+только чтение. Может команда для них должна как то по другому выглядеть?

Petya V4sechkin
15-02-2009, 17:49
pretzel, для удаления скрытых файлов нужна опция /AH.
Выполните del /? и все поймете.

pretzel
15-02-2009, 17:54
Petya V4sechkin, большое Вам спасибо!

SharkyEXE
14-11-2009, 23:59
А как переместить всю папку с ее содержимым, включая подпапки и файлы в другое место? Например, есть папка D:\UPXPRus (в ней содержатся подпапки + файлы), эту папку D:\UPXPRus надо переместить в корень диска E:\, чтобы получилось E:\UPXPRus (в ней содержатся подпапки + файлы). Спасибо.

amel27
15-11-2009, 03:59
переместить всю папку с ее содержимым, включая подпапки и файлы в другое место »
@Echo Off

Set $S=E:\UPXPRus
Set $D=D:\UPXPRus

If Not Exist "%$D%" XCOPY "%$S%" "%$D%" /E/H/K/I/Q&& RD /S/Q "%$S%"

SharkyEXE
15-11-2009, 10:24
amel27, спасибо. :good:

На основе этого (http://forum.oszone.net/post-1270606-17.html) сообщения, привожу два батника ниже.
Код ниже: перемещение папки UPXPRus (с подпапками и файлами), находящуюся в корне диска E в папку UPXPRus, которая находится в корне диска D.
@Echo Off

Set $S=E:\UPXPRus
Set $D=D:\UPXPRus

If Not Exist "%$D%" XCOPY "%$S%" "%$D%" /E/H/K/I/Q&& RD /S/Q "%$S%"

Код ниже: перемещение папки UPXPRus (с подпапками и файлами), находящуюся в корне диска D в папку UPXPRus, которая находится в корне диска E.
@Echo Off

Set $S=D:\UPXPRus
Set $D=E:\UPXPRus

If Not Exist "%$D%" XCOPY "%$S%" "%$D%" /E/H/K/I/Q&& RD /S/Q "%$S%"




© OSzone.net 2001-2012