Есть у меня на сервере Windows 2000 структура папок для всего предприятия. При этом для каждого пользователя и отдела есть своя папка PostBox. Всего их около 300. Структура такая: Общая папка предприятия - Папки Отделов - Папка PostBox отдела + Папки сотрудников, состоящие из папок MyDocs и PostBox. Задача написать скрипт, который бы удалял все содержимое папок PostBox. Не подскажите как он будет выглядеть, может кто уже сталкивался с подобной задачей.
» Написание скрипта для удаления файлов в папках c одним имене
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)
Сообщи если работает....
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
Немного поковырялся.
Код:
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
evle
Цитата:
www.microsoft.com/scripting
Но мне это монстром не кажется...
Это мне проще понять чем то, что ты написал
Да и у меня быстрее ИМХО. Это ты 3 прохода делаешь. Если у reyst 300 пользователей, пусть у каждого по 50 (линивые они у него) файлоффф....... это примерно 15000 получается.. долговато ИМХО будет...
Да и у VBS приемущество есть - по сетке работает...
Цитата:
Ты как такого монстра собрал
www.microsoft.com/scripting
Но мне это монстром не кажется...
Это мне проще понять чем то, что ты написал
Да и у меня быстрее ИМХО. Это ты 3 прохода делаешь. Если у reyst 300 пользователей, пусть у каждого по 50 (линивые они у него) файлоффф....... это примерно 15000 получается.. долговато ИМХО будет...
Да и у VBS приемущество есть - по сетке работает...
FreemanRU
00:48 29-04-2005
Цитата:
Вряд ли, SQL запросы не очень быстро выполняются, но это не особо важно.
Цитата:
По файловой системе полтора прохода как и у тебя (выборка файлов и удаление их части) То что в середине ходит по одному файлу со списком.
Цитата:
Согласен. Только было указано, что файлы на сервере.
В общем, на вкус и цвет...
00:48 29-04-2005
Цитата:
Да и у меня быстрее ИМХО
Вряд ли, SQL запросы не очень быстро выполняются, но это не особо важно.
Цитата:
Это ты 3 прохода делаешь
По файловой системе полтора прохода как и у тебя (выборка файлов и удаление их части) То что в середине ходит по одному файлу со списком.
Цитата:
Да и у VBS приемущество есть - по сетке работает...
Согласен. Только было указано, что файлы на сервере.
В общем, на вкус и цвет...
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
В твоем варианте, ИМХО, будут удалены файлы в папках, содержащих в своем пути "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
Alan Mon
16:25 29-04-2005
Цитата:
По моему, результат одинаков, у файлов в папке PostBox в пути содержится \PostBox\, и наоборот, у файлов, в пути \PostBox\ найдется предок (папка), лежащая в папке PostBox. Так что это одно и то же.
А вот в твоем коде ошибка: кроме нужных файлов удалится также все из папок "notPostBox", "PostBox1" и др. Нужно вот так:
echo %DIRPATH:~-7% | find "\\PostBox\\" && del /Q %1\*.*
16:25 29-04-2005
Цитата:
Это не одно и то же.
По моему, результат одинаков, у файлов в папке PostBox в пути содержится \PostBox\, и наоборот, у файлов, в пути \PostBox\ найдется предок (папка), лежащая в папке PostBox. Так что это одно и то же.
А вот в твоем коде ошибка: кроме нужных файлов удалится также все из папок "notPostBox", "PostBox1" и др. Нужно вот так:
echo %DIRPATH:~-7% | find "\\PostBox\\" && del /Q %1\*.*
evle
Результат не одинаков. У файлов в папке PostBox\Pupkin тоже в пути содержится PostBox.
Цитата:
А вот это верное замечание. Из notPostBox - удалится. Но из PostBox1 - нет.
Если в папках PostBox нет подпапок или если из этих подпапок нужно тоже удалить файлы тогда можно вообще одной строкой обойтись.
Код: for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && del /Q %%~fi\*.*
Результат не одинаков. У файлов в папке PostBox\Pupkin тоже в пути содержится PostBox.
Цитата:
кроме нужных файлов удалится также все из папок "notPostBox", "PostBox1"
А вот это верное замечание. Из notPostBox - удалится. Но из PostBox1 - нет.
Если в папках PostBox нет подпапок или если из этих подпапок нужно тоже удалить файлы тогда можно вообще одной строкой обойтись.
Код: for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && del /Q %%~fi\*.*
Alan Mon
18:42 29-04-2005
Вариант с %DIRPATH:~-7% вообще не работает, т. к. получается "ostBox " поставил 8 - заработало.
Цитата:
Да. действительно, результат не одинаков: мой вариант очищает вложенные папки, а твой нет. Остается выяснить, что нужно было автору вопроса.
Цитата:
Как ни странно, работает. Хотя я так и не понял, почему \" не обрабатывается, как эскейп-последовательность...
18:42 29-04-2005
Вариант с %DIRPATH:~-7% вообще не работает, т. к. получается "ostBox " поставил 8 - заработало.
Цитата:
Результат не одинаков. У файлов в папке PostBox\Pupkin тоже в пути содержится PostBox.
Да. действительно, результат не одинаков: мой вариант очищает вложенные папки, а твой нет. Остается выяснить, что нужно было автору вопроса.
Цитата:
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && del /Q %%~fi\*.*
Как ни странно, работает. Хотя я так и не понял, почему \" не обрабатывается, как эскейп-последовательность...
Попробовал все приведенные здесь 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 (вложенные папки и файлы)...
Добавлено:
Не поделитесь ли ссылочками, где можно было поподробнее узнать о приведенных Вами командах, а то "смотрю в книгу и вижу фигу"
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 (вложенные папки и файлы)...
Добавлено:
Не поделитесь ли ссылочками, где можно было поподробнее узнать о приведенных Вами командах, а то "смотрю в книгу и вижу фигу"
reyst
18:15 04-05-2005
Цитата:
Странно. Ты куда их записывал?
Цитата:
Предупреждать надо. Подумаю на досуге.
Цитата:
По батникам во встроенной справке. Поиск по слову "CMD". По vbScript в MSDN, хотя может быть есть что попроще.
18:15 04-05-2005
Цитата:
Из них сработал только 4-ый!!!
Странно. Ты куда их записывал?
Цитата:
вложенные папки и файлы
Предупреждать надо. Подумаю на досуге.
Цитата:
где можно было поподробнее узнать о приведенных Вами командах
По батникам во встроенной справке. Поиск по слову "CMD". По vbScript в MSDN, хотя может быть есть что попроще.
Народ подскажите плиз как програмно расшарить папку на флешке при ее подключении
причем у пользователя отсутствуют права админа. Нужно это для следующего: есть 1Ска распределенная шеф таскает на флешке файлы обмена между базами, казалось бы все просто. но 1Ска стоит под терминалом, а у шефа на его машине нет прав администратора, соответственно он не может расшарить подключенную флешку(да и лениво это ему каждый раз делать). И еще пробовал расшаривать флешку входя под админом, все прекрасно работает, но как только выключают комп при следующем включении Винда почемуто "забывает" что флешка была расшаренной , можно ли как то это забороть?
причем у пользователя отсутствуют права админа. Нужно это для следующего: есть 1Ска распределенная шеф таскает на флешке файлы обмена между базами, казалось бы все просто. но 1Ска стоит под терминалом, а у шефа на его машине нет прав администратора, соответственно он не может расшарить подключенную флешку(да и лениво это ему каждый раз делать). И еще пробовал расшаривать флешку входя под админом, все прекрасно работает, но как только выключают комп при следующем включении Винда почемуто "забывает" что флешка была расшаренной , можно ли как то это забороть?
evle
В первом варианте сохранил как vbs-файл и запускал через wscript, во всех остальных случаях запускал как bat-файлы с корневой папки с PostBox-ами.
В первом варианте сохранил как vbs-файл и запускал через wscript, во всех остальных случаях запускал как bat-файлы с корневой папки с PostBox-ами.
reyst
во втором варианте надо 7 заменить на 8 (у меня так заработал).
3-й сам проверял, у меня работал.
Если сами папки Postbox можно ненадолго удалить, то попробуй такой вариант (нет времени проверять, но может и сработать)
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi
во втором варианте надо 7 заменить на 8 (у меня так заработал).
3-й сам проверял, у меня работал.
Если сами папки Postbox можно ненадолго удалить, то попробуй такой вариант (нет времени проверять, но может и сработать)
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi
Цитата:
Если сами папки Postbox можно ненадолго удалить
сами папки Postbox должны бязательно остаться - их около 300-х штук - создавать заново проблематично
reyst
Ты не понял, они тут же и создаются, в этом же батнике (должны, во всяком случае), просто права не выставляются на них, если специфические были.
Ты не понял, они тут же и создаются, в этом же батнике (должны, во всяком случае), просто права не выставляются на них, если специфические были.
reyst
Цитата:
Ты Path и Drive надеюсь поправил?
Какая ошибка вываливается?
Цитата:
where Path = '\\общая папка предприятия\\' and Drive = 'c:' and Name = 'PostBox'
Ты Path и Drive надеюсь поправил?
Какая ошибка вываливается?
FreemanRU
Цитата:
конечно
Цитата:
ошибок как раз и нет, но результата к сожелению тоже - файлы не удаляются
Цитата:
Ты Path и Drive надеюсь поправил?
конечно
Цитата:
Какая ошибка вываливается?
ошибок как раз и нет, но результата к сожелению тоже - файлы не удаляются
evle
ОК! Благодарю! Все было бы класс, но:
Цитата:
К сожалению это очень даже существенно. При выполнения скрипта создаюся папки PostBox с правами унаследованными от папки-родителя, а мне нужно чтобы Все имели полный доступ. Можно ли как-нибудь дописать команду
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi
, чтобы права (Security) были всем на полный доступ или может можно другой командой это сделать?
ОК! Благодарю! Все было бы класс, но:
Цитата:
просто права не выставляются на них, если специфические были.
К сожалению это очень даже существенно. При выполнения скрипта создаюся папки PostBox с правами унаследованными от папки-родителя, а мне нужно чтобы Все имели полный доступ. Можно ли как-нибудь дописать команду
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi
, чтобы права (Security) были всем на полный доступ или может можно другой командой это сделать?
reyst
У папки-родителя выставь права всем в полный доступ, но "Только для подпапок и файлов"
У папки-родителя выставь права всем в полный доступ, но "Только для подпапок и файлов"
reyst
Попробуй добавить "&& xcacls %%~fi /G Все:F /Y"
Утилиту xcacls искать у Microsoft'а (http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/xcacls-o.asp)
Инфу брал тут.
Если винда английская, заменить Все на All.
Добавлено:
Alan Mon
Хорошая идея. Только вот
Цитата:
Попробуй добавить "&& xcacls %%~fi /G Все:F /Y"
Утилиту xcacls искать у Microsoft'а (http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/xcacls-o.asp)
Инфу брал тут.
Если винда английская, заменить Все на All.
Добавлено:
Alan Mon
Хорошая идея. Только вот
Цитата:
Всего их около 300
evle
Я немного запутался - строку "&& xcacls %%~fi /G Все:F /Y"
нужно добавить в предыдущую команду For или она идет отдельной командой. Если отдельной, то гди фигурирует имя "PostBox"?
Добавлено:
Alan Mon
Структура предполагает, что у 300 пользователей есть 300 папок (папки-родители с правами только для чтения и запрета на удаление входящий папок), состоящие из папки PostBox с полным доступом для всех и с папки MyDocs с полным доступом только для пользователя владельца. Поэтому для того, чтобы
Цитата:
нужно поменять у 300 разноименных папок права, а затем после выполнения скрипта востановить те , что были до него.... А это очень проблематично ...
Я немного запутался - строку "&& xcacls %%~fi /G Все:F /Y"
нужно добавить в предыдущую команду For или она идет отдельной командой. Если отдельной, то гди фигурирует имя "PostBox"?
Добавлено:
Alan Mon
Структура предполагает, что у 300 пользователей есть 300 папок (папки-родители с правами только для чтения и запрета на удаление входящий папок), состоящие из папки PostBox с полным доступом для всех и с папки MyDocs с полным доступом только для пользователя владельца. Поэтому для того, чтобы
Цитата:
У папки-родителя выставь права всем в полный доступ
нужно поменять у 300 разноименных папок права, а затем после выполнения скрипта востановить те , что были до него.... А это очень проблематично ...
reyst
Строчку надо в конец старой добавлять. Если папка не PostBox, то до этой команды дело не дойдет.
Строчку надо в конец старой добавлять. Если папка не PostBox, то до этой команды дело не дойдет.
evle
Тобишь общая команда будет такой?
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi && xcacls %%~fi /G Everyone:F /Y
Тобишь общая команда будет такой?
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q %%~fi && MD %%~fi && xcacls %%~fi /G Everyone:F /Y
reyst
20:41 12-05-2005
Цитата:
Примерно так.
Работать должна следующим образом:
Рекурсивно перечислить все папки, находящиеся внутри заданной. Для каждой выполнить следующие операции:
Удалить
Создать
Дать полный доступ всем
Не забудь xcacls положить в зону досягаемости.
20:41 12-05-2005
Цитата:
Тобишь общая команда будет такой?
Примерно так.
Работать должна следующим образом:
Рекурсивно перечислить все папки, находящиеся внутри заданной. Для каждой выполнить следующие операции:
Удалить
Создать
Дать полный доступ всем
Не забудь xcacls положить в зону досягаемости.
evle
БЛАГОДАРСТВУЮ!!! Все работает отлично, только вот возникла маленькая проблема:
в папках, имена которых более одного слова, независимо на английском или русском, возникает ошибка The system cannot find the file specifed. Помогает только убирание пробелов в названии папки. Можно ли тут что-то придумать ?
БЛАГОДАРСТВУЮ!!! Все работает отлично, только вот возникла маленькая проблема:
в папках, имена которых более одного слова, независимо на английском или русском, возникает ошибка The system cannot find the file specifed. Помогает только убирание пробелов в названии папки. Можно ли тут что-то придумать ?
reyst
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q "%%~fi" && MD "%%~fi" && xcacls "%%~fi" /G Everyone:F /Y
В смысле кавычки расставь. Если не заметил.
for /R <Путь к корню> %%i in (.) do echo %%~fi\ | find "\PostBox\" && RD /S /Q "%%~fi" && MD "%%~fi" && xcacls "%%~fi" /G Everyone:F /Y
В смысле кавычки расставь. Если не заметил.
Alan Mon
Спасибочки !!!
Все заработало!!!
А можно ли задать права, чтобы на создаваемы папки был поный доступ помимо удаления самой папки?
Спасибочки !!!
Все заработало!!!
А можно ли задать права, чтобы на создаваемы папки был поный доступ помимо удаления самой папки?
reyst
23:12 13-05-2005
Цитата:
Не понял. Поясни.
23:12 13-05-2005
Цитата:
А можно ли задать права, чтобы на создаваемы папки был поный доступ помимо удаления самой папки?
Не понял. Поясни.
По данному скрипту установлено Everyone:F, тобишь на полный доступ. Первоначально стоит правило полный доступ и в Advanced настройках Security отмечено поле запрета на удаление - тобишь саму папку удалить Everyone нельзя. При этом скрипту это мешать не будет - скрипт при своей работе удаляет их без проблем ...
Предыдущая тема: Автоматизация администрирования. Скрипты на KIX
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.