Показать полную графическую версию : Удаление папок средствами Windows
dreamzed
09-07-2017, 23:20
Помогите новичку плиз.
"Необходимо написать скрипт и запускать его при каждом выходе пользователя из виндоус. Скрипт должен очищать заданную директорию по определенной маске: директория -
C:\Users\"ПОЛЬЗОВАТЕЛЬ"\AppData\Local\1C\1cv8
удаляем только папки с названиями типа - 73c58a87-39c7-4571-b760-5a70505b271f
статично кол-во символов между дефисами, общее кол-во символов в названии и набор символов - любые цифры и буквы без спецсимволов и пробелов."
Вобщем не могу понять как задачу на удаление папок с определённым количеством символов,а остальные файлу и папки,чтоб оставались целыми.
dreamzed, ? в маске обозначает один любой символ:
dir C:\Users\ПОЛЬЗОВАТЕЛЬ\AppData\Local\1C\1cv8\????????-????-????-????-????????????
Тут бы хорошо смотрелось такое:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=%LocalAppData%\1C\1cv8
set sTemplate=[0-9a-f]
set sTemplate4=%sTemplate%%sTemplate%%sTemplate%%sTemplate%
set sTemplate8=%sTemplate4%%sTemplate4%
set sTemplate12=%sTemplate4%%sTemplate4%%sTemplate4%
if exist "%sSourceFolder%\." (
pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:d "????????-????-????-????-????????????" ^| findstr.exe /r /i /x /c:"%sTemplate8%-%sTemplate4%-%sTemplate4%-%sTemplate4%-%sTemplate12%"`) do echo rd /s /q "%%~i"
popd
)
) else (
echo Can't find source folder [%sSourceFolder%].
exit /b 1
)
endlocal
exit /b 0
но, к сожалению, как не крути — шаблон получается на шесть символов длиннее, нежели допустимо для findstr.exe. И это под новыми ОС! Для XP и ниже в плане ограничений всё ещё хуже.
Посему, либо с некоторым низким риском удаления лишнего:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=%LocalAppData%\1C\1cv8
if exist "%sSourceFolder%\." (
pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:d "????????-????-????-????-????????????"`) do echo rd /s /q "%%~i"
popd
)
) else (
echo Can't find source folder [%sSourceFolder%].
exit /b 1
)
endlocal
exit /b 0
(для реального удаления убрать выделенное echo), либо WSH/PoSH, где нет таких ограничений.
любые цифры и буквы без спецсимволов и пробелов." »
Судя по внешнему виду — никак не «любые буквы».
megaloman
10-07-2017, 14:00
В CMD есть риск непредсказуемого поведения команды с маской. Set WShell = CreateObject("WScript.Shell")
WhereDir = WShell.ExpandEnvironmentStrings("%LocalAppData%") + "\1C\1cv8"
Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.FolderExists(WhereDir) Then
MsgBox "Нет папки" + vbCrLf + vbCrLf + WhereDir
Else
On Error Resume Next
LL = FSO.DeleteFolder(WhereDir + "\????????-????-????-????-????????????", True)
On Error GoTo 0
End If
Здесь под ? тоже понимается любой символ. Можно, конечно, задействовать регулярные выражения, но это получится более громоздко. СтОит ли игра свеч?
Судя по внешнему виду — никак не «любые буквы». »
dreamzed, ...а буквенные представления 16-ричных значений, т.е. шесть букв: от A до F.
В CMD есть риск непредсказуемого поведения команды с маской. »
Почему?
в CMD маски ведут себя эталонно - их там придумали, если в VBS поведение отличается - это как раз вызывает недоумение.
dreamzed
10-07-2017, 20:01
#4
у меня сейчас тестовая папка находится по такому пути- D:\1c\1c8
подскажите пожалуйста,что поменять в вашем коде.чтобы он заработал.
Ещё раз прошу прощение за нубизм, первый раз в жизни со скриптами столкнулся)
megaloman
10-07-2017, 20:35
Тут бы хорошо смотрелось .... но, к сожалению ...»
Нормальные герои всегда идут в обход
@Echo Off
Set "BoxIn=%LocalAppData%\1C\1cv8"
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:d "%BoxIn%\????????-????-????-????-?????????????"`) Do Call :DelDir "%%i"
GoTo :Eof
:DelDir
Set "DirName=%~1"
If "%DirName:~35,1%"=="" GoTo :Eof
Set "Delim=%DirName:~8,1%%DirName:~13,1%%DirName:~18,1%%DirName:~23,1%%DirName:~36,1%
If Not "%Delim%"=="----" GoTo :Eof
Set "Symb=%DirName:~0,8%%DirName:~9,4%%DirName:~14,4%%DirName:~19,4%%DirName:~24,12%
Echo %Symb%| Findstr.exe /R /I "[^0-9a-z]" >nul|| RD /S /Q "%BoxIn%\%~1"
GoTo :Eof
rem 1 2 3
rem 012345678901234567890123456789012345
rem 73c58a87-39c7-4571-b760-5a70505b271f
rem 12345678 1234 1234 1234 123456789012
у меня сейчас тестовая папка находится по такому пути- D:\1c\1c8 »
Напишите Set "BoxIn=D:\1c\1c8"
В vbs-скрипте WhereDir = "D:\1C\1cv8"
megaloman
10-07-2017, 20:50
Busla, в CMD маски ведут себя эталонно - их там придумали » ИМХО, это опасное заблуждение, возможно справедливое для файлов с именами формата 8.3. Например (совершенно случайно наткнулся), команда:
dir /B /A:D "????????-????-????-????-????????????"
Выдаст (естественно, при наличии папок)
73c58a87-39c7-4571-b760-3a70505b271
73c58a87-39c7-4571-b760-5a70505b271f
73c58a87-39c7-4571-b760-5
Спрогнозировать иные выверты работы команд CMD с маской не берусь, сталкивался с ними не раз, для меня это непредсказуемо, хотя когда-то на форуме объяснение звучало
А вот CMD с рег выражением отработал и пока обмануть его не получилось.
Кстати, в моём vbs-скрипте с этой маской тоже кривая история, так что надо его переписывать, алгоритм только придумать.
dreamzed
10-07-2017, 20:51
Cпасибо Вам Огромное!Да прибудет с Вами высокие зарплаты и крепкое здоровье!
В CMD есть риск непредсказуемого поведения команды с маской. »
Везде есть ;). Поскольку везде используются одни и те же функции WinAPI.
СтОит ли игра свеч? »
Коль это будет более правильно — конечно, стоит. «Более громоздко» — ну, добавится несколько строк для регулярки, например:
Option Explicit
Dim objFSO
Dim objFolder
Dim strSourceFolder
Dim objRegExp
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = WScript.CreateObject("Shell.Application").NameSpace("shell:Local AppData")
If Not objFolder Is Nothing Then
strSourceFolder = objFSO.BuildPath(objFolder.self.Path, "1C\1cv8")
If objFSO.FolderExists(strSourceFolder) Then
With WScript.CreateObject("VBScript.RegExp")
.IgnoreCase = True
.Pattern = "^[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}$"
For Each objFolder In objFSO.GetFolder(strSourceFolder).SubFolders
If .Test(objFolder.Name) Then
objFolder.Delete True
End If
Next
End With
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 2
End If
Else
WScript.Echo "Can't connect to Local AppData folder."
WScript.Quit 1
End If
Set objFSO = Nothing
WScript.Quit 0
...а буквенные представления 16-ричных значений, т.е. шесть букв: от A до F. »
Именно так. Поскольку название — явно одно из представлений UUID — Википедия (https://ru.wikipedia.org/wiki/UUID).
Спрогнозировать иные выверты работы команд CMD с маской не берусь, сталкивался с ними не раз, для меня это непредсказуемо, хотя когда-то на форуме объяснение звучало »
Коварные короткие имена, особенно для имён, не входящих в A-Z.
megaloman
11-07-2017, 11:09
Plan = Array(8, 4, 4, 4, 12) ' Число символов в каждой части имени
Delim = "-" ' Разделитель
Mask = "[0-9a-z]" ' Маска допустимых символов в имени
Set WShell = CreateObject("WScript.Shell")
BoxIn = WShell.ExpandEnvironmentStrings("%LocalAppData%") + "\1C\1cv8"
Set FSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set InBox = FSO.GetFolder(BoxIn)
If Err.Number <> 0 Then
MsgBox "Папка" + vbCrLf + vbCrLf + BoxIn + vbCrLf + vbCrLf + Err.Description
On Error GoTo 0
Else
On Error GoTo 0
N1 = LBound(Plan)
N2 = UBound(Plan)
NLen = 0
For i = N1 To N2
InMask = InMask + Mask + "{" + CStr(Plan(i)) + "}"
NLen = NLen + Plan(i)
If i <> N2 Then
InMask = InMask + Delim
NLen = NLen + 1
End If
Next
Set RegMaska = New RegExp
RegMaska.Pattern = InMask
RegMaska.IgnoreCase = True
Set AllFolders = InBox.SubFolders
For Each Folder In AllFolders
NameFolder = Folder.Name
If NLen = Len(NameFolder) Then
If RegMaska.Test(NameFolder) Then
On Error Resume Next
LL = FSO.DeleteFolder(BoxIn + "\" + NameFolder, True)
If Err.Number <> 0 Then
MsgBox "Папка" + vbCrLf + vbCrLf + BoxIn + "\" + NameFolder + vbCrLf + vbCrLf + Err.Description
End If
On Error GoTo 0
' MsgBox Folder.Name
End If
End If
Next
End IfЕсли в самом деле в имени папок только шестнадцатиричные числа, то маску нужно указать как
"[0-9a-f]"
Mask = "[0-9a-z]" »
Для данного случая, как вы и сказали в конце, a-f
Вариант заглавных букв (A-F) не учитывается? Я бы учёл на всякий случай.
Вариант заглавных букв (A-F) не учитывается? Я бы учёл на всякий случай. »
Учитывается:
RegMaska.IgnoreCase = True »
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.