Показать полную графическую версию : [решено] Перемещение (удаление) директорий по маске
Mast need скрипт каторый бы перемещал или удалял директории по маске. В моем случае по такой ( ~* ), можно просто принцип хотябы (IMHO длинный батник получится). Заранее спасибо.
Например, так:
@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 с консолью работает :(
Busla, не могли бы вы указать чайнику, где конкретно в вашем тексте маска удаляемых папок? Я понял, что она в кавычках:
.*\\~[^\\]*\\\.
Это верно?
файл: 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);
}
Гыыы, как все сложно. Я по проше способ нашел:
текст файла del.vbs
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFolder "С:\path\~*", 1
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, например, он не работает
Busla,
1.
оно ищет совсем другие папки »
я запустил у себя тестовый пример, нашло как раз папки *32
2.
без ряда изменений оно не адаптируется к поставленной задаче »
на мой взгляд задача
Mast need скрипт каторый бы перемещал или удалял директории по маске. В моем случае по такой ( ~* ), можно просто принцип хотябы (IMHO длинный батник получится). Заранее спасибо. »
вполне выполнена
3.
про WSH не спрашивали »
средство программирования не уточнялось, извините
По-моему последний пример ven00m вполне подходит. кратко и ёмко.
ven00m конечно же виднее, что ему надо... Я ориентировался на первоначальную формулировку - заголовок в категории "CMD/BAT".
Ваш скрипт ищет папки в имени которых встречается 32. А в функцию-обработчик передаёт не полный путь, а только название папки. Поэтому и счёл необходимым предупредить, что в некоторых случаях он может грохнуть совсем не те папки, который задумывались.
Честно говоря, в голову не приходило, что ven00m требуется такая простая вещь - это разжёвано в справке к for:
for /d %%d in (~*) do rd /s /q %%d
А если надо удалять только директории, например, с названием OldVersions (со всеми файлами в ней содержащимися) из всех подкаталогов текущего каталога(и возможно из подкаталогов каталогов), то это возможно сделать как cmd-скрипт, без применения языков программирования?
Petya V4sechkin
15-02-2009, 15:04
pretzel, примерно так:
For /D /R %%I In (OldVersions*) Do If "%%~nxI"=="OldVersions" RD /S /Q "%%~I"
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
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 /? и все поймете.
Petya V4sechkin, большое Вам спасибо!
SharkyEXE
14-11-2009, 23:59
А как переместить всю папку с ее содержимым, включая подпапки и файлы в другое место? Например, есть папка D:\UPXPRus (в ней содержатся подпапки + файлы), эту папку D:\UPXPRus надо переместить в корень диска E:\, чтобы получилось E:\UPXPRus (в ней содержатся подпапки + файлы). Спасибо.
переместить всю папку с ее содержимым, включая подпапки и файлы в другое место »
@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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.