2014-09-05 4 views
2

Я хочу создать сценарий в Windows 7, чтобы удалить все в директории, которая не является изображением. ТакWindows-скрипт для удаления всего, кроме расширения файлов изображений

for all files in directory X 

    if file y does not have extension in (.png, .gif, .jpeg) 

    delete y 

    end 

это его

как я могу найти или создать такой скрипт

заметь, некоторые изображения являются важными, так что этот сценарий должен работать правильно :) Я не думаю, Я должен экспериментировать здесь, и даже если бы я протестировал свой собственный скрипт в небольшой директории с экспериментальными файлами, я не уверен, что я должен попробовать.

У меня есть этот код, как предложил:

::extensions are delimited with space // filename is del_stuff.bat 

set "extensions_list=.png .gif .jpeg .bmp .jpg " 
pushd "C:\Users\denman\Desktop\xxx\" 
for /f "delims=" %%f in ('dir /b ^|findstr /i /e /v "%extensions_list%" ') do (
     echo del /q /f "%%~f" 
) 
popd 

Но я получаю эту ошибку:

enter image description here

+1

Если у вас уже есть свой скрипт, вы можете поделиться им. Кроме того, никогда не предполагайте, что программа будет работать на 100% без проблем. Собственно, всегда принимайте окончательный отказ, вы будете менее разочарованы позже. :) – Neolisk

+0

Что касается PowerShell, то Remove-Item - это командлет, который вы хотите, и гениальность этого заключается в том, что есть переключатель -WhatIf, который просто выводит на экран то, что произойдет, вместо того, чтобы фактически удалять что-либо, чтобы он полностью безопасно использовать, пока вы используете переключатель -WhatIf. Попробуйте и вернитесь, если у вас возникнут проблемы. Я уверен, что мы сможем помочь, если вы получите ошибки и нуждаетесь в некоторых рекомендациях. – TheMadTechnician

+0

Вопросы должны включать код, который вы пробовали, и проблемы, с которыми вы столкнулись. Вопросы с просьбой написать сценарий для вас не по теме. –

ответ

2
@echo off 
::extensions are delimited with space 
set "extensions_list=.png .gif .jpeg " 
pushd "C:\Directory_with_pictures" && (
    for /f "delims=" %%f in ('dir /b /a-d ^|findstr /i /e /v "%extensions_list%" ') do (
     echo del /q /f "%%~f" 
    ) 
    popd 
) 

'эхо' является для проверки результата .Снять эхо активировать удаление. И изменить "C:\Directory_with_pictures" с фактическим путем.

EDIT тестирование сценария:

@echo off 

md test_dir>nul 2>&1 
echo #>test_dir\t1.png 
echo #>test_dir\t1.txt 
echo #>test_dir\t1.tst 
echo #>test_dir\t1.jpg 
echo #>test_dir\t1.gif 

echo #>test_dir\t2.png 
echo #>test_dir\t2.txt 
echo #>test_dir\t2.tst 
echo #>test_dir\t2.jpg 
echo #>test_dir\t2.gif 

echo -- before deleting-- 
dir /b .\test_dir\* 
echo(
echo(

::extensions are delimited with space 
set "extensions_list=.png .gif .jpeg .jpg" 


pushd "test_dir" 
for /f "delims=" %%f in ('dir /b ^|findstr /i /e /v "%extensions_list%" ') do (
     del /q /f "%%~f" 
) 
popd 

echo -- after deleting -- 
dir /b .\test_dir\* 

Выход:

-- before deleting-- 
t1.gif 
t1.jpg 
t1.png 
t1.tst 
t1.txt 
t2.gif 
t2.jpg 
t2.png 
t2.tst 
t2.txt 


-- after deleting -- 
t1.gif 
t1.jpg 
t1.png 
t2.gif 
t2.jpg 
t2.png 
+0

это, похоже, не работает, я поместил файл .txt и файл .png в каталог, и не был удален:/ –

+0

@AlexMills - проверка этого ... – npocmaka

+0

@AlexMills - проверить мои edit.Script работает как ожидалось . Добавлен параметр '/ q/f' в команду del. – npocmaka

2

Использование Powershell, вы можете получить список файлов, вам нужно что-то вроде этого:

Get-ChildItem | where {!$_.PsIsContainer -and !(@(".png",".gif",".jpeg") -contains $_.Extension) } 

Я оставил команду Delete, убедитесь, что t он возвращает правильные результаты, прежде чем вы это сделаете.

+1

Ну, если мы собираемся просто кормить его, почему бы не «GCI» C: \ Path \ To \ Files \ * '-Include' * .png ',' *. Gif ',' *. Jpeg ' 'и позволить провайдеру фильтровать его? Это намного быстрее, если у вас много файлов. – TheMadTechnician

+0

@ TheMadTechnician: показать истинную силу Powershell! Серьезно, хотя, моя powershell ржавая, но это то, как я делал это в одном из моих сценариев некоторое время назад. Вышеупомянутое в основном демонстрирует использование '.PsIsContainer'. Также не стесняйтесь публиковать свои комментарии. Мы не на codegolf, но я покажу его как кратчайшее решение. :) – Neolisk

+1

Теперь, когда я думаю об этом, мое предложение делает полную противоположность тому, что он хочет. '-Include' должен быть' -Exclude'. Кроме того, он не возвращает каталоги, поэтому вам даже не нужно проверять наличие .PSIsContainer и напрямую обращаться к Remove-Item. – TheMadTechnician

Смежные вопросы