Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удаление папок средствами Windows (http://forum.oszone.net/showthread.php?t=328222)

dreamzed 09-07-2017 23:20 2750261

Удаление папок средствами Windows
 
Помогите новичку плиз.
"Необходимо написать скрипт и запускать его при каждом выходе пользователя из виндоус. Скрипт должен очищать заданную директорию по определенной маске: директория -
C:\Users\"ПОЛЬЗОВАТЕЛЬ"\AppData\Local\1C\1cv8
удаляем только папки с названиями типа - 73c58a87-39c7-4571-b760-5a70505b271f
статично кол-во символов между дефисами, общее кол-во символов в названии и набор символов - любые цифры и буквы без спецсимволов и пробелов."
Вобщем не могу понять как задачу на удаление папок с определённым количеством символов,а остальные файлу и папки,чтоб оставались целыми.

Busla 10-07-2017 00:10 2750272

dreamzed, ? в маске обозначает один любой символ:
Код:

dir C:\Users\ПОЛЬЗОВАТЕЛЬ\AppData\Local\1C\1cv8\????????-????-????-????-????????????

Iska 10-07-2017 05:06 2750288

Тут бы хорошо смотрелось такое:
Скрытый текст
Код:

@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, где нет таких ограничений.

Цитата:

Цитата dreamzed
любые цифры и буквы без спецсимволов и пробелов." »

Судя по внешнему виду — никак не «любые буквы».

megaloman 10-07-2017 14:00 2750375

В CMD есть риск непредсказуемого поведения команды с маской.
Вот vbs-скрипт, где задача решена средствами WSH
Код:

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

Здесь под ? тоже понимается любой символ. Можно, конечно, задействовать регулярные выражения, но это получится более громоздко. СтОит ли игра свеч?

mwz 10-07-2017 15:18 2750383

Цитата:

Цитата Iska
Судя по внешнему виду — никак не «любые буквы». »

dreamzed, ...а буквенные представления 16-ричных значений, т.е. шесть букв: от A до F.

Busla 10-07-2017 19:11 2750452

Цитата:

Цитата megaloman
В CMD есть риск непредсказуемого поведения команды с маской. »

Почему?
в CMD маски ведут себя эталонно - их там придумали, если в VBS поведение отличается - это как раз вызывает недоумение.

dreamzed 10-07-2017 20:01 2750465

#4
у меня сейчас тестовая папка находится по такому пути- D:\1c\1c8
подскажите пожалуйста,что поменять в вашем коде.чтобы он заработал.
Ещё раз прошу прощение за нубизм, первый раз в жизни со скриптами столкнулся)

megaloman 10-07-2017 20:35 2750475

Цитата:

Цитата Iska
Тут бы хорошо смотрелось .... но, к сожалению ...»

Цитата:

Цитата Бармалей
Нормальные герои всегда идут в обход

Вот CMD с регулярным выражением.

Код:

@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


Цитата:

Цитата dreamzed
у меня сейчас тестовая папка находится по такому пути- D:\1c\1c8 »

Напишите Set "BoxIn=D:\1c\1c8"
В vbs-скрипте WhereDir = "D:\1C\1cv8"

megaloman 10-07-2017 20:50 2750479

Busla,
Цитата:

Цитата 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 2750480

Cпасибо Вам Огромное!Да прибудет с Вами высокие зарплаты и крепкое здоровье!

Iska 11-07-2017 10:41 2750553

Цитата:

Цитата megaloman
В CMD есть риск непредсказуемого поведения команды с маской. »

Везде есть ;). Поскольку везде используются одни и те же функции WinAPI.


Цитата:

Цитата megaloman
СтОит ли игра свеч? »

Коль это будет более правильно — конечно, стоит. «Более громоздко» — ну, добавится несколько строк для регулярки, например:
Скрытый текст
Код:

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



Цитата:

Цитата mwz
...а буквенные представления 16-ричных значений, т.е. шесть букв: от A до F. »

Именно так. Поскольку название — явно одно из представлений UUID — Википедия.


Цитата:

Цитата megaloman
Спрогнозировать иные выверты работы команд CMD с маской не берусь, сталкивался с ними не раз, для меня это непредсказуемо, хотя когда-то на форуме объяснение звучало »

Коварные короткие имена, особенно для имён, не входящих в A-Z.

megaloman 11-07-2017 11:09 2750562

Мой vbs-скрипт с регулярными выражениями и настройками на вид имени
Код:

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]"

mwz 12-07-2017 11:17 2750845

Цитата:

Цитата megaloman
Mask = "[0-9a-z]" »

Для данного случая, как вы и сказали в конце, a-f
Вариант заглавных букв (A-F) не учитывается? Я бы учёл на всякий случай.

Iska 12-07-2017 12:17 2750858

Цитата:

Цитата mwz
Вариант заглавных букв (A-F) не учитывается? Я бы учёл на всякий случай. »

Учитывается:
Цитата:

Цитата megaloman
RegMaska.IgnoreCase = True »



Время: 02:18.

Время: 02:18.
© OSzone.net 2001-