Есть у меня на сервере 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
elet %%~fi  
goto :end
   
  elet
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
elet %%~fi  goto :end
 elet
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, истории становления российского интернета. Сделано для людей.
