Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Написание скрипта для удаления файлов в папках c одним имене

Автор: reyst
Дата сообщения: 28.04.2005 16:13
Есть у меня на сервере Windows 2000 структура папок для всего предприятия. При этом для каждого пользователя и отдела есть своя папка PostBox. Всего их около 300. Структура такая: Общая папка предприятия - Папки Отделов - Папка PostBox отдела + Папки сотрудников, состоящие из папок MyDocs и PostBox. Задача написать скрипт, который бы удалял все содержимое папок PostBox. Не подскажите как он будет выглядеть, может кто уже сталкивался с подобной задачей.
Автор: FreemanRU
Дата сообщения: 28.04.2005 16:56
reyst


Цитата:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colFolders = objWMIService.ExecQuery("Select * from Win32_Directory where Path = '\\общая папка предприятия\\' and Drive = 'c:' and Name = 'PostBox' ")

For Each objFolder in colFolders
Wscript.Echo objFolder.Name
Next

Wscript.Echo "done"

проверь так, потом всместо выделенного жирным поставь:

Цитата:

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder(objFolder.Name)
Set objFolder = objFSO.CreateFolder(objFolder.Name)


Сообщи если работает....
Автор: evle
Дата сообщения: 28.04.2005 18:05
reyst
Немного поковырялся.

Код:
for /R %%i in (*) do echo %%i >> allfiles
findstr /l "\\PostBox\\" allfiles > filestoremove
for /f %%i in (filestoremove) do del %%i
del allfiles
del filestoremove
Автор: FreemanRU
Дата сообщения: 28.04.2005 18:48
evle

Цитата:
Ты как такого монстра собрал

www.microsoft.com/scripting

Но мне это монстром не кажется...
Это мне проще понять чем то, что ты написал

Да и у меня быстрее ИМХО. Это ты 3 прохода делаешь. Если у reyst 300 пользователей, пусть у каждого по 50 (линивые они у него) файлоффф....... это примерно 15000 получается.. долговато ИМХО будет...
Да и у VBS приемущество есть - по сетке работает...
Автор: evle
Дата сообщения: 28.04.2005 19:01
FreemanRU
00:48 29-04-2005
Цитата:
Да и у меня быстрее ИМХО

Вряд ли, SQL запросы не очень быстро выполняются, но это не особо важно.

Цитата:
Это ты 3 прохода делаешь

По файловой системе полтора прохода как и у тебя (выборка файлов и удаление их части) То что в середине ходит по одному файлу со списком.
Цитата:
Да и у VBS приемущество есть - по сетке работает...

Согласен. Только было указано, что файлы на сервере.
В общем, на вкус и цвет...
Автор: Alan Mon
Дата сообщения: 29.04.2005 10:25
evle
В твоем варианте, ИМХО, будут удалены файлы в папках, содержащих в своем пути "PostBox". А это насколько я понял неверно. Нужно удалять в папках, называющихся "PostBox". Это не одно и то же.
reyst
Я тут тоже батник набросал:

Код: for /R <Путь к корню твоих папок> %%i in (.) do call :delet %%~fi
goto :end

:delet
set DIRPATH=%1
echo %DIRPATH:~-7% | find "PostBox" && del /Q %1\*.*

:end
Автор: evle
Дата сообщения: 29.04.2005 11:25
Alan Mon
16:25 29-04-2005
Цитата:
Это не одно и то же.

По моему, результат одинаков, у файлов в папке PostBox в пути содержится \PostBox\, и наоборот, у файлов, в пути \PostBox\ найдется предок (папка), лежащая в папке PostBox. Так что это одно и то же.
А вот в твоем коде ошибка: кроме нужных файлов удалится также все из папок "notPostBox", "PostBox1" и др. Нужно вот так:
echo %DIRPATH:~-7% | find "\\PostBox\\" && del /Q %1\*.*
Автор: Alan Mon
Дата сообщения: 29.04.2005 12:42
evle
Результат не одинаков. У файлов в папке PostBox\Pupkin тоже в пути содержится PostBox.

Цитата:
кроме нужных файлов удалится также все из папок "notPostBox", "PostBox1"

А вот это верное замечание. Из notPostBox - удалится. Но из PostBox1 - нет.

Если в папках PostBox нет подпапок или если из этих подпапок нужно тоже удалить файлы тогда можно вообще одной строкой обойтись.

Код: for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && del /Q %%~fi\*.*
Автор: evle
Дата сообщения: 29.04.2005 19:51
Alan Mon
18:42 29-04-2005
Вариант с %DIRPATH:~-7% вообще не работает, т. к. получается "ostBox " поставил 8 - заработало.

Цитата:
Результат не одинаков. У файлов в папке PostBox\Pupkin тоже в пути содержится PostBox.

Да. действительно, результат не одинаков: мой вариант очищает вложенные папки, а твой нет. Остается выяснить, что нужно было автору вопроса.

Цитата:
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && del /Q %%~fi\*.*

Как ни странно, работает. Хотя я так и не понял, почему \" не обрабатывается, как эскейп-последовательность...
Автор: reyst
Дата сообщения: 04.05.2005 12:15
Попробовал все приведенные здесь 4 варианта:

1)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colFolders = objWMIService.ExecQuery("Select * from Win32_Directory where Path = '\\общая папка предприятия\\' and Drive = 'c:' and Name = 'PostBox' ")

For Each objFolder in colFolders
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder(objFolder.Name)
Set objFolder = objFSO.CreateFolder(objFolder.Name) Next

Wscript.Echo "done"


2)
for /R <Путь к корню твоих папок> %%i in (.) do call elet %%~fi
goto :end

elet
set DIRPATH=%1
echo %DIRPATH:~-7% | find "PostBox" && del /Q %1\*.*

:end

3)
for /R %%i in (*) do echo %%i >> allfiles
findstr /l "\\PostBox\\" allfiles > filestoremove
for /f %%i in (filestoremove) do del %%i
del allfiles
del filestoremove

4)
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && del /Q %%~fi\*.*

Из них сработал только 4-ый!!!
Сработал он правда с двумя ограничениями: не удаляются системные файлы и не удаляются вложенные в папку PostBox папки, удаляются только находящиеся в них папки. Задача стоит удалять полностью все содержимое папок PostBox (вложенные папки и файлы)...




Добавлено:
Не поделитесь ли ссылочками, где можно было поподробнее узнать о приведенных Вами командах, а то "смотрю в книгу и вижу фигу"
Автор: evle
Дата сообщения: 04.05.2005 12:43
reyst
18:15 04-05-2005
Цитата:
Из них сработал только 4-ый!!!

Странно. Ты куда их записывал?

Цитата:
вложенные папки и файлы

Предупреждать надо. Подумаю на досуге.


Цитата:
где можно было поподробнее узнать о приведенных Вами командах

По батникам во встроенной справке. Поиск по слову "CMD". По vbScript в MSDN, хотя может быть есть что попроще.
Автор: 4esz
Дата сообщения: 04.05.2005 13:06
Народ подскажите плиз как програмно расшарить папку на флешке при ее подключении
причем у пользователя отсутствуют права админа. Нужно это для следующего: есть 1Ска распределенная шеф таскает на флешке файлы обмена между базами, казалось бы все просто. но 1Ска стоит под терминалом, а у шефа на его машине нет прав администратора, соответственно он не может расшарить подключенную флешку(да и лениво это ему каждый раз делать). И еще пробовал расшаривать флешку входя под админом, все прекрасно работает, но как только выключают комп при следующем включении Винда почемуто "забывает" что флешка была расшаренной , можно ли как то это забороть?
Автор: reyst
Дата сообщения: 04.05.2005 14:24
evle
В первом варианте сохранил как vbs-файл и запускал через wscript, во всех остальных случаях запускал как bat-файлы с корневой папки с PostBox-ами.
Автор: evle
Дата сообщения: 04.05.2005 14:46
reyst
во втором варианте надо 7 заменить на 8 (у меня так заработал).
3-й сам проверял, у меня работал.
Если сами папки Postbox можно ненадолго удалить, то попробуй такой вариант (нет времени проверять, но может и сработать)
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi
Автор: reyst
Дата сообщения: 04.05.2005 15:15

Цитата:
Если сами папки Postbox можно ненадолго удалить


сами папки Postbox должны бязательно остаться - их около 300-х штук - создавать заново проблематично
Автор: evle
Дата сообщения: 04.05.2005 16:13
reyst
Ты не понял, они тут же и создаются, в этом же батнике (должны, во всяком случае), просто права не выставляются на них, если специфические были.
Автор: FreemanRU
Дата сообщения: 04.05.2005 16:44
reyst

Цитата:
where Path = '\\общая папка предприятия\\' and Drive = 'c:' and Name = 'PostBox'


Ты Path и Drive надеюсь поправил?
Какая ошибка вываливается?
Автор: reyst
Дата сообщения: 06.05.2005 18:12
FreemanRU

Цитата:
Ты Path и Drive надеюсь поправил?


конечно


Цитата:
Какая ошибка вываливается?


ошибок как раз и нет, но результата к сожелению тоже - файлы не удаляются
Автор: reyst
Дата сообщения: 12.05.2005 11:19
evle

ОК! Благодарю! Все было бы класс, но:


Цитата:
просто права не выставляются на них, если специфические были.


К сожалению это очень даже существенно. При выполнения скрипта создаюся папки PostBox с правами унаследованными от папки-родителя, а мне нужно чтобы Все имели полный доступ. Можно ли как-нибудь дописать команду
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi

, чтобы права (Security) были всем на полный доступ или может можно другой командой это сделать?
Автор: Alan Mon
Дата сообщения: 12.05.2005 11:40
reyst
У папки-родителя выставь права всем в полный доступ, но "Только для подпапок и файлов"
Автор: evle
Дата сообщения: 12.05.2005 11:45
reyst
Попробуй добавить "&& xcacls %%~fi /G Все:F /Y"
Утилиту xcacls искать у Microsoft'а (http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/xcacls-o.asp)
Инфу брал тут.
Если винда английская, заменить Все на All.

Добавлено:
Alan Mon
Хорошая идея. Только вот

Цитата:
Всего их около 300

Автор: reyst
Дата сообщения: 12.05.2005 14:10
evle
Я немного запутался - строку "&& xcacls %%~fi /G Все:F /Y"
нужно добавить в предыдущую команду For или она идет отдельной командой. Если отдельной, то гди фигурирует имя "PostBox"?


Добавлено:
Alan Mon
Структура предполагает, что у 300 пользователей есть 300 папок (папки-родители с правами только для чтения и запрета на удаление входящий папок), состоящие из папки PostBox с полным доступом для всех и с папки MyDocs с полным доступом только для пользователя владельца. Поэтому для того, чтобы

Цитата:
У папки-родителя выставь права всем в полный доступ

нужно поменять у 300 разноименных папок права, а затем после выполнения скрипта востановить те , что были до него.... А это очень проблематично ...
Автор: evle
Дата сообщения: 12.05.2005 14:24
reyst
Строчку надо в конец старой добавлять. Если папка не PostBox, то до этой команды дело не дойдет.
Автор: reyst
Дата сообщения: 12.05.2005 14:41
evle
Тобишь общая команда будет такой?

for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi && xcacls %%~fi /G Everyone:F /Y
Автор: evle
Дата сообщения: 12.05.2005 14:47
reyst
20:41 12-05-2005
Цитата:
Тобишь общая команда будет такой?

Примерно так.
Работать должна следующим образом:
Рекурсивно перечислить все папки, находящиеся внутри заданной. Для каждой выполнить следующие операции:

Удалить
Создать
Дать полный доступ всем

Не забудь xcacls положить в зону досягаемости.
Автор: reyst
Дата сообщения: 13.05.2005 15:07
evle
БЛАГОДАРСТВУЮ!!! Все работает отлично, только вот возникла маленькая проблема:
в папках, имена которых более одного слова, независимо на английском или русском, возникает ошибка The system cannot find the file specifed. Помогает только убирание пробелов в названии папки. Можно ли тут что-то придумать ?
Автор: Alan Mon
Дата сообщения: 13.05.2005 15:13
reyst
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q "%%~fi" && MD "%%~fi" && xcacls "%%~fi" /G Everyone:F /Y

В смысле кавычки расставь. Если не заметил.
Автор: reyst
Дата сообщения: 13.05.2005 17:12
Alan Mon
Спасибочки !!!
Все заработало!!!

А можно ли задать права, чтобы на создаваемы папки был поный доступ помимо удаления самой папки?
Автор: evle
Дата сообщения: 13.05.2005 17:32
reyst
23:12 13-05-2005
Цитата:
А можно ли задать права, чтобы на создаваемы папки был поный доступ помимо удаления самой папки?

Не понял. Поясни.
Автор: reyst
Дата сообщения: 13.05.2005 18:18
По данному скрипту установлено Everyone:F, тобишь на полный доступ. Первоначально стоит правило полный доступ и в Advanced настройках Security отмечено поле запрета на удаление - тобишь саму папку удалить Everyone нельзя. При этом скрипту это мешать не будет - скрипт при своей работе удаляет их без проблем ...

Страницы: 12

Предыдущая тема: Автоматизация администрирования. Скрипты на KIX


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.