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

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

Profile 06-11-2019 08:10 2894947

Как сохранить только два типа файлов?
 
Здравствуйте, уважаемые форумчане.
...есть диск с множеством папок и подпапок разной глубины с файлами различных расширений, нужно во всем этом хаосе оставить только два типа файлов, но с условием, что они находятся вместе в одной папке. Если условие не выполнено, то необходимо удалить папку с файлами целиком, т.е. в итоге необходимо получить диск без пустых папок, а в папках, которые остались должны быть файлы с двумя расширениями.
Помогите пожалуйста решить этот вопрос через командную строку.

DJ Mogarych 06-11-2019 13:16 2894974

Цитата:

Цитата Profile
Если условие не выполнено, то необходимо удалить папку с файлами целиком, »

А если во вложенной папке условие выполняется, а в вышестоящей - нет? Если удалить вышестоящую, то вложенная затрётся.

Profile 06-11-2019 14:05 2894983

Цитата:

Цитата DJ Mogarych
Если удалить вышестоящую, то вложенная затрётся. »

если во вложенной условие выполняется- то вышестоящая папка должна остаться, даже если все вышестоящие папки до корня будут пустые

DJ Mogarych 06-11-2019 15:46 2894996

Тут, видимо, надо в два этапа.

Powershell:
Код:

# Удаление ненужных файлов
$folders = (dir D:\temp\123 -Recurse -Directory -Force).fullname
$ext = ".jpg",".png"

$folders |% {
$files = dir "$_" -File -Force
if ($files.extension -notcontains "$($ext[0])" -or $files.extension -notcontains "$($ext[1])") {
    foreach ($file in $files.fullname) {del "$file" -force -confirm:$false}
    }
else {del $files.FullName -Exclude "*$($ext[0])","*$($ext[1])" -Force -confirm:$false}
}
# Удаление пустых каталогов
$folders |% {
$files = dir "$_" -File -Recurse -Force
if (!($files)) {del "$_" -force -confirm:$false}
}


megaloman 06-11-2019 19:45 2895040

Исправленный вариант
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "Ext1=.xls"
        Set "Ext2=.doc"

        For /F "usebackq delims=" %%d In (`2^>nul Dir "%BoxIn%" /B /S /A:D ^|Sort /R`) Do (
                Call :ExtDel "%Ext1%"  "%Ext2%" "%%d"
        )
        Pushd "%BoxIn%" &&Call :ExtDel "%Ext1%"  "%Ext2%" "%BoxIn%"
        Popd
Exit /B 0

:ExtDel
        FOR /F "usebackq delims=" %%i IN (`2^>nul Dir /B /A:-D "%~3\*.*"`) DO (
                If /I Not "%%~xi"=="%~1" If /I Not "%%~xi"=="%~2" Del /A /F /Q "%~3\%%~i"
        )

        FOR /F "usebackq delims=" %%i IN (`2^>nul Dir /B /A:-D "%~3\*%~1"`) DO (
                If /I "%%~xi"=="%~1" FOR /F "usebackq delims=" %%j IN (`2^>nul Dir /B /A:-D "%~3\*%~2"`) DO (
                        If /I "%%~xj"=="%~2" Exit /B 0
                )
        )
        Del /A /F /Q "%~3\*.*"
        2>nul Rd "%~3"
Exit /B 1


Iska 06-11-2019 20:14 2895044

DJ Mogarych, не хватает удаления прочих типов файлов в каталоге, где содержатся и .jpg, и .png.

DJ Mogarych 06-11-2019 22:13 2895058

Переделал, см. выше.

megaloman 07-11-2019 15:21 2895131

Еще вариант
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "Ext1=.xls"
        Set "Ext2=.doc"

        For /F "usebackq delims=" %%f In (`2^>nul Dir "%BoxIn%\" /B /S /A:-D ^|FINDSTR /E /I /V /C:"%Ext1%" /C:"%Ext2%"`) Do Del /A /F /Q "%%f"

        For /F "usebackq delims=" %%d In (`2^>nul Dir "%BoxIn%" /B /S /A:D ^|Sort /R`) Do (
                Call :ExtDel "%Ext1%"  "%Ext2%" "%%d"
        )
        Pushd "%BoxIn%" &&Call :ExtDel "%Ext1%"  "%Ext2%" "%BoxIn%"
        Popd
Exit /B 0

:ExtDel
        FOR /F "usebackq delims=" %%i IN (`2^>nul Dir /B /A:-D "%~3\*%~1"`) DO (
                If /I "%%~xi"=="%~1" FOR /F "usebackq delims=" %%j IN (`2^>nul Dir /B /A:-D "%~3\*%~2"`) DO (
                        If /I "%%~xj"=="%~2" Exit /B 0
        ))
        Del /A /F /Q "%~3\*.*"
        2>nul Rd "%~3"
Exit /B 1


Profile 10-11-2019 14:13 2895558

Спасибо всем большое.
Все получилось)


Время: 00:28.

Время: 00:28.
© OSzone.net 2001-