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

ven00m 19-01-2008 11:57 720601

Перемещение (удаление) директорий по маске
 
Mast need скрипт каторый бы перемещал или удалял директории по маске. В моем случае по такой ( ~* ), можно просто принцип хотябы (IMHO длинный батник получится). Заранее спасибо.

Busla 19-01-2008 18:31 720802

Например, так:
Код:

@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 721779

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

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

Это верно?

pva 21-01-2008 08:23 721844

файл: 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 722034

Гыыы, как все сложно. Я по проше способ нашел:
текст файла del.vbs
Код:

Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFolder "С:\path\~*", 1


Busla 21-01-2008 13:45 722087

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

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

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

pva 31-01-2008 14:36 729883

Busla,
1.
Цитата:

Цитата Busla
оно ищет совсем другие папки »

я запустил у себя тестовый пример, нашло как раз папки *32
2.
Цитата:

Цитата Busla
без ряда изменений оно не адаптируется к поставленной задаче »

на мой взгляд задача
Цитата:

Цитата ven00m
Mast need скрипт каторый бы перемещал или удалял директории по маске. В моем случае по такой ( ~* ), можно просто принцип хотябы (IMHO длинный батник получится). Заранее спасибо. »

вполне выполнена
3.
Цитата:

Цитата Busla
про WSH не спрашивали »

средство программирования не уточнялось, извините

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

Busla 31-01-2008 17:34 730049

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

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

Честно говоря, в голову не приходило, что ven00m требуется такая простая вещь - это разжёвано в справке к for:
Код:

for /d %%d in (~*) do rd /s /q %%d

pretzel 15-02-2009 14:20 1039074

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

Petya V4sechkin 15-02-2009 15:04 1039118

pretzel, примерно так:
Код:

For /D /R %%I In (OldVersions*) Do If "%%~nxI"=="OldVersions" RD /S /Q "%%~I"

pretzel 15-02-2009 17:05 1039251

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 1039268

Цитата:

Цитата pretzel
надо еще удалять все файлы с расширениями *.bak, *.db, *.cd~, *.lck

Код:

Del /F /S /Q *.bak *.db *.cd~ *.lck

pretzel 15-02-2009 17:43 1039293

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 1039299

pretzel, для удаления скрытых файлов нужна опция /AH.
Выполните del /? и все поймете.

pretzel 15-02-2009 17:54 1039304

Petya V4sechkin, большое Вам спасибо!

SharkyEXE 14-11-2009 23:59 1270508

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

amel27 15-11-2009 03:59 1270606

Цитата:

Цитата SharkyEXE
переместить всю папку с ее содержимым, включая подпапки и файлы в другое место »

Код:

@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 1270685

amel27, спасибо. :good:

На основе этого сообщения, привожу два батника ниже.
Код ниже: перемещение папки 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%"



Время: 00:08.

Время: 00:08.
© OSzone.net 2001-