2016-05-10 3 views
1

Im пытается написать сценарий для очистки моего рабочего стола. Я хочу, чтобы удалить все файлы и каталоги, кроме 10. Мой код партии shortcuts.I использование Windows, заключается в следующем:Удаление всех файлов и каталогов с рабочего стола, кроме .lnk

@echo off 
COLOR 0E 
cd "C:/Users/DA/Desktop" 
FORFILES /S /C "if @ext!=lnk del /F /Q /S" 
rd /S /Q "." 
pause 
exit 

Может быть, это глупая ошибка, но Im новичок в командной строке Windows. Заранее спасибо.

+0

Что относительно папок, расположенных на вашем рабочем столе - вы хотите удалить их все? – aschipfl

ответ

0

Есть несколько вопросов, в вашем коде:

  1. Вы должны предшествовать командной строке после переключателя /Cforfiles с cmd /C, bec ause вы используете внутренние консольные команды (if, del). Если вы опустите cmd /C, forfiles пытается найти файл программы с именем if, которого не существует.
  2. Оператор сравнения != для оператора if. Вы имеете в виду не равно, поэтому вам нужно указать if not <expression1>==<expression2>.
  3. Переменная @ext расширяется до расширения файла, заключенного в кавычки, поэтому вам необходимо указать их также в lnk. Поскольку "" находятся в указанной командной строке позади forfiles/C, вам необходимо сбежать от них, как \", чтобы установить литерал " символов.
  4. Вы забыли указать, что нужно удалить с помощью команды del.
  5. Коммутаторы /S из forfiles, а также del означает обработку также элементов в подкаталогах, но я предполагаю, что вы этого не хотите, потому что хотите очистить свой каталог Desktop.
  6. Есть команда rd, поэтому я предполагаю, что вы хотите удалить любые каталоги из Desktop. Тем не менее, rd /S /Q "." пытается удалить весь каталог Desktop (который не будет работать, если ваш пакетный файл будет изменен на этот каталог на cd). Я бы поместил команду rd в командную строку forfiles, потому что есть возможность проверить, является ли текущий итерированный элемент файлом или каталогом (forfiles имеет переменную @isdir для этой цели).
  7. Команда cd работает только в том случае, если вы запускаете командный файл с того же диска, где находится каталог Desktop (если вы не указали переключатель /D). Я бы пошел на команду pushd, которая временно переходит в каталог Desktop, пока не появится команда popd.
  8. Вместо жесткого кодирования местоположения каталога Desktop я бы использовал встроенную переменную окружения %USERPROFILE%, которая указывает на каталог профиля пользователя текущего пользователя, где находится каталог Desktop.
  9. Команда exit без переключателя /B не только заканчивает пакетный файл, но и завершает экземпляр интерпретатора команд, в котором запущен командный файл. Это не имеет значения, когда вы запускаете командный файл двойным щелчком мыши, но это делает когда вы выполняете его в командной строке.

Вот исправленный и улучшенный код:

@echo off 
title Clean Up Desktop & rem // (this is the window title, just for fun) 
color 0E 
pushd "%USERPROFILE%\Desktop" || exit /B 1 & rem // (the command after `||` runs if `pushd` fails, when the dir. is not found) 
rem /* Here you can see how to distinguish between files and directories; 
rem files are deleted with `del`, directories are removed with `rd`. 
rem The upper-case `ECHO`s are there for testing purposes only; 
rem remove them as soon as you actually want to delete any items: */ 
forfiles /C "cmd /C if @isdir==FALSE (if /I not @ext==\"lnk\" ECHO del /F /Q @relpath) else ECHO rd /S /Q @relpath" 
pause 
popd & rem // (this restores the previous working directory) 
exit /B & rem // (this quits the batch file only; not necessary at the end of the script) 
0

Вы можете попробовать что-то вроде этого:

@echo off 
COLOR 0E 
CD /D "%userprofile%\Desktop" 
Rem To delete folders 
for /f "delims=" %%a in ('Dir /b /AD ^| find /v "lnk"') do echo rd /S /Q "%%a" 
pause 
Rem To Delete files 
for /f "delims=" %%a in ('Dir /b ^| find /v "lnk"') do echo del /F /Q /S "%%a" 
pause 
exit 

NB: Когда исполнение в порядке, просто избавиться от echo команды

+0

Если у любого из элементов на рабочем столе есть 'lnk' в любом месте их имен, они не будут удалены вашим скриптом; Я бы добавил параметр '/ A-D' во вторую командную строку' Dir', чтобы соответствовать только файлам (хотя не должно быть ни одного каталога слева); и я удаляю (лишний) '/ S'-переключатель из команды' del' ... – aschipfl

0

Вы можете использовать команды for и if для достижения этой цели:

@echo off 
COLOR 0E 
cd C:/Users/DA/Desktop 
for /d %x in (*) do @rd /s /q "%x" 
for %i in (*) do if not %i == *.lnk del "%i" 
pause 

Довольно просто и прекрасно работает.
Убедитесь, что% i и% x находятся в "".

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