Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/75: Рейтинг темы: голосов - 75, средняя оценка - 4.96
6 / 6 / 2
Регистрация: 03.02.2012
Сообщений: 283
1

Удаление файлов и папок в корзину

06.12.2016, 21:39. Показов 14797. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Подскажите как переместить файлы и папки из папки Х в корзину посредством командной строки. Хочу написать батник выполняющий эту операцию. Возможно ли это средствами CMD или необходимы дополнительные утилиты? Тогда подскажите какие, плиз.

Добавлено через 13 минут
Удаленные файлы чтоб можно было восстановить из корзины.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2016, 21:39
Ответы с готовыми решениями:

Удаление файлов в корзину
Доброго времени суток. Требуется сделать удаление файлов в корзину. Сделал все как представлено...

Удаление файлов и папок
В общем такая проблема... есть батник @echo off set "d=F:\Clean" set "d1=IT" set "d2=All"...

Удаление папок и файлов
Доброго времени суток! Проблема заключается в следующем, на сервере при перезагрузке нужно...

Удаление файлов и папок
В общем проблема такая: у меня есть файловый менеджер, отображение элементов идет через treeview...

17
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
07.12.2016, 02:01 2
Oleg_cyber,
Это и не на cmd непросто.
"C:\RECYCLER\{SID_пользователя}" в WinXP, "C:\$Recycle.Bin\{SID_пользователя}" в Win7 и это только для диска С, а для каждого диска своя корзина и файл с конретного диска переносится в свою корзину, но и это еще не все, он ко всему прочему еще и определенным образом переименовывается. Поместив командно мы не увидим его в корзине.
Так что проще поступить таким образом. Если хотите от bat поведения, примерного как при обычной работе, создайте в укромном (или не очень) месте папочку "А ля мусоросборник" и с помощью move помещаете хламье туда, а какой-то отдельный батничек с командой:
Windows Batch file
1
cd /d "Мусорка" && rd /s /q "Мусорка" 2>nul
когда уже завоняется конкретно
1
6 / 6 / 2
Регистрация: 03.02.2012
Сообщений: 283
07.12.2016, 09:22  [ТС] 3
Спасибо, попробую.
0
5989 / 1998 / 323
Регистрация: 10.12.2013
Сообщений: 6,879
07.12.2016, 09:48 4
берёшь слово SHFileOperation,
присовокупляешь к нему recycle bin и с данным набором
осуществляешь trip по мировой паутине. Начать можно с ветки Win32 API C++ данного форума.
если найдётся адекватное решение с powershell - наилучший вариант.

Добавлено через 12 минут
самое короткое:
PowerShell
1
2
3
4
$shell = new-object -comobject "Shell.Application"
$folder = $shell.Namespace("<path to file>")
$item = $folder.ParseName("<name of file>")
$item.InvokeVerb("delete")
насколько я понимаю, здесь должно появится стандартное окошко с анимацией при перемещении файла в корзину.
0
6 / 6 / 2
Регистрация: 03.02.2012
Сообщений: 283
07.12.2016, 11:10  [ТС] 5
volodin661, сейчас попробую на своём компе...

Добавлено через 1 час 6 минут
Увы не катит. В Powershell честно говоря я мало понимаю, а изучать этот язык ради написания одного команд лета не с руки... Вариант с "мусорной" папкой лучше.
0
5989 / 1998 / 323
Регистрация: 10.12.2013
Сообщений: 6,879
07.12.2016, 11:30 6
Цитата Сообщение от Oleg_cyber Посмотреть сообщение
1) Увы не катит. 2) В Powershell честно говоря я мало понимаю, а 3) изучать этот язык ради написания одного команд лета не с руки... 4) Вариант с "мусорной" папкой лучше.
1) катит
2) есть оболочки/"программные технологии", в которых ты много понимаешь?
3) Это базовый бурно развивающийся shell от Microsoft, другого пока нет; изучать что либо или нет - зависит от задач, которые потребуется решать
4) Это не вариант, если посмотреть на название топика, это просто копирование в другую папку.
И если это то, что тебе требуется, то название папки должно быть короткое латинское + атрибут Hidden.
0
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
07.12.2016, 12:11 7
Oleg_cyber, а где Вы здесь вообще узрели командлет? Командлеты пишутся, как правило, на высокоуровневых языках вроде C#/VB.NET/F# и иже с ними; то, что пишется на языке самого PS, является функцией. Последние, начиная с PS v2функционально близки командлетам, но таковыми не являются. В остальном не могу не согласиться с volodin661, за исключением локалезависимости предложенного им варианта. Идеологически правильным была бы следующая команда:
PowerShell
1
(New-Object -ComObject Shell.Application).NameSpace(0xA).MoveHere((Get-Item [файл|папка]).FullName)
Метод MoveHere определенный для RecycleBin принимает два параметра, первый из которых полный путь до файла или папки. В принципе пример можно переписать на WSH, сгибридив с CMD.
0
6 / 6 / 2
Регистрация: 03.02.2012
Сообщений: 283
07.12.2016, 12:20  [ТС] 8
Учту.
0
5989 / 1998 / 323
Регистрация: 10.12.2013
Сообщений: 6,879
07.12.2016, 12:54 9
greg zakharov, это какая локалезависимость, неужто "delete" ?

( сие решение просто скопипастил, как и предлагал сам в начале )
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
07.12.2016, 13:34 10
Лучший ответ Сообщение было отмечено Dragokas как решение

Решение

Oleg_cyber,
Перетаскиваешь на иконку батника (не запуская его) любое кол-во файлов - и они удаляются в корзину.

Visual Basic
1
2
3
4
5
6
7
8
'2>nul&cls&pushd "%~dp0"&@cscript /nologo /e:vbscript "%~f0" %*&exit/b
set shell = CreateObject("Shell.Application")
set recycle = shell.Namespace(10)
Set args = WScript.Arguments
For i = 0 to args.Count - 1 
     file = args(i)
     recycle.MoveHere(file)
Next
Код сохранить с расширением .bat
2
6 / 6 / 2
Регистрация: 03.02.2012
Сообщений: 283
07.12.2016, 15:42  [ТС] 11
Перетаскиваешь на иконку батника (не запуская его) любое кол-во файлов - и они удаляются в корзину.
Код реально работает! Спасибо А как бы "допилить" его до батника, очищающего определенную папку? Конкретно мне нужно очищать содержимое папки D:\Загрузки
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
07.12.2016, 16:49 12
Лучший ответ Сообщение было отмечено Oleg_cyber как решение

Решение

Oleg_cyber,
Чтобы допилить ТЗ должно быть более конкретным:
1) откуда вы собираетесь запускать батник
2) как вы собираетесь передавать путь к папке:
а) через указание в переменной внутри кода
б) через cmd - передачей аргумента
в) иным способом
2) а нужен ли вообще батник, так как vbs можно и так запускать
и т.д.

Добавлено через 1 час 0 минут
Вариант с указанием папки для очистки в переменной:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'2>nul&cls&@cscript /nologo /e:vbscript "%~f0" %*&exit/b
root = "d:\загрузки"
set shell = CreateObject("Shell.Application")
set fso = CreateObject("Scripting.FileSystemObject")
set recycle = shell.Namespace(10)
set rootFolder = fso.GetFolder(root)
 
For Each file in rootFolder.Files
    recycle.MoveHere(file.Path)
Next
 
For Each folder in rootFolder.SubFolders
    recycle.MoveHere(folder.Path)
Next
0
6 / 6 / 2
Регистрация: 03.02.2012
Сообщений: 283
07.12.2016, 18:07  [ТС] 13
1. Из проводника.
2. Внутри кода.
3. Может быть, вы в кодах лучше рулите.
4. Thanks.

Добавлено через 21 минуту
Что-то у меня из папки Загрузки ничего не удаляется

Добавлено через 2 минуты
Может быть я туплю, но где в вашем коде прописывается значение переменной Path?

Добавлено через 13 минут
Ах да, понятно..недоразумение вышло

Добавлено через 22 минуты
Недоразумение вышло..сохранял не в той кодировке. Сейчас всё работает ОК. Респект
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
07.12.2016, 18:44 14
Цитата Сообщение от greg zakharov Посмотреть сообщение
за исключением локалезависимости предложенного им варианта.
На сколько я помню метод InvokeVerb исполняет локале-независимый глагол (всегда на англ.).

Не по теме:


Вот шпаргалка из давних записей:


Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
'1) Способ 1 - здесь нужно использовать глаголы на английском
objFolderItem.InvokeVerb ("Copy")
 
'2) Способ 2 - здесь нужно использовать глаголы согласно системным настройкам языка
For Each objFIV In objFolderItem.Verbs()
    If objFIV.Name = "&Копировать" Then '&Открыть
        objFIV.DoIt
        Exit For
    End If
Next
Полный код (для теста): копирование объекта ярлыка (и не только) в буфер обмена:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
'15 минут проморочился, почему выдает ошибку, что не найден объект "ярлык"
'оказывается есть Public\Desktop, а есть User\Desktop и оба отображаются на одном столе
Path_dpnx = "c:\users\Public\desktop\Resident Evil Revelations.lnk" 'тестирую ярлык
'Path_dpnx = "c:\users\alex\desktop\RemDrive.cmd - ярлык.lnk"
'Path_dpnx = "c:\VoiceSpy\reports\29.05.2013" 'тестирую папку
'Path_dpnx = "c:\VoiceSpy\reports\29.05.2013\29.05.2013_22_58_31.jpg" 'тестирую файл
'Path_dpnx = "c:" 'тестирую корень
 
'Чтобы получить путь к объекту через аргументы или меню Shell:SendTo
'Раскомментируйте нижнюю строку:
'if WScript.Arguments.Count > 0 then Path_dpnx = WScript.Arguments(0)
 
Set objShellApp = CreateObject("Shell.Application")
 
'В языке VBScript не поддерживаются метки: работаем через цикл
Do
  Path_d = Left(Path_dpnx, 3)
  Set objFolder = objShellApp.Namespace(Path_d) '"C:"
 
  If Len(Path_dpnx) > 3 Then
      Path_pnx = Mid(Path_dpnx, 4)
      Set objFolderItem = objFolder.ParseName(Path_pnx) '"VoiceSpy\reports\29.05.2013"
      If objFolderItem.isLink Then 'является ли объект ярлыком?
          ItsLink = True
          On Error Resume Next
              Set objLink = objFolderItem.GetLink
          If Err = 0 Then
              Path_dpnx = objLink.Path
          Else 'if err = 70 (Permissions Denied)
              Err.Clear
              'msgbox "Для этой операции требуется повышение привилегий"
              'Silent-режим: если не хватает прав использую ссылку на исходный ярлык вместо целевого объекта
              ItsLink = False
          End If
          On Error Resume Next
      Else
          ItsLink = False
      End If
  Else 'если корневой каталог
      Set objFolderItem = objFolder.Self
      ItsLink = False
  End If
 
Loop While (ItsLink = True) 'выполнять пока целевой объект - ярлык
 
'Ниже мы копируем в буфер обмена ссылку на объект
 
'1) Способ 1 - здесь нужно использовать глаголы на английском
objFolderItem.InvokeVerb ("Copy")
 
'2) Способ 2 - здесь нужно использовать глаголы согласно системным настройкам языка
For Each objFIV In objFolderItem.Verbs()
    If objFIV.Name = "&Копировать" Then '&Открыть
        objFIV.DoIt
        Exit For
    End If
Next
 
' Вот так можно просмотреть всю коллекцию глаголов, которые поддерживает конкретный выделенный объект
' Лучше смотреть на англоязычной винде (т.к. эти глаголы обратносовместимы с локализациями)
 
If objFolderItem.IsFolder Then 'Если объект - папка
    Set objFileOrFolder = objFolderItem.GetFolder.Self
Else
    Set objFileOrFolder = objFolder.ParseName(Path_pnx)
End If
Set objVerbs = objFileOrFolder.Verbs
If (Not objVerbs Is Nothing) Then
    For Each Verb In objVerbs
        MsgBox Verb.Name
        'Debug.Print Verb.Name
    Next
End If
0
724 / 323 / 133
Регистрация: 17.03.2014
Сообщений: 811
07.12.2016, 19:13 15
Цитата Сообщение от volodin661 Посмотреть сообщение
3) Это базовый бурно развивающийся shell от Microsoft, другого пока нет; изучать что либо или нет - зависит от задач, которые потребуется решать
более того, приближается время, когда на Win10 придётся шаманить с бубном :wall:, чтобы запустить интепретатор CMD
0
5989 / 1998 / 323
Регистрация: 10.12.2013
Сообщений: 6,879
07.12.2016, 19:49 16
b0gus,
слова в статье по ссылке написаны правильные,
но нет ссылок на офиц. Microsoft ресурсы.
Особые опасения к тому же внушает фамилия автора.
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
07.12.2016, 20:56 17
b0gus, как по мне они сами не знают, чем бы им заняться.
Сперва начинают делать в win10 улучшалки для CMD, а потом заменяют алиас cmd на PowerShell.
0
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
07.12.2016, 21:07 18
Цитата Сообщение от Dragokas
На сколько я помню метод InvokeVerb исполняет локале-независимый глагол
Спорить и доказывать что-либо не стану, скажу лишь по факту как есть. Когда-то наступал на грабли с InvokeVerb. В какой-то из версий Windows при попытке вызвать "delete" ничего не происходило, но после обращения к COM-обозревателю выяснилось, что для корзинки есть глагол "Удалить", а "delete" там не упомяналось. Какбы там ни было, у меня есть самописная тулза для манипуляций корзиной из консоли. Да и в PS кое-какие командлеты имеются.
1
07.12.2016, 21:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2016, 21:07
Помогаю со студенческими работами здесь

Поиск и удаление файлов/папок
Здравствуйте. У меня такой вопрос! Как сделать bat файл, один из которых будет искать и удалять...

Удаление защищенных папок и файлов
Добрый день! Подскажите со скриптом, не могу понять как можно сделать так, чтобы удалялись...

Удаление папок и файлов с выбором
Здравствуйте, прошу вашей помощи. У меня на диске C:\ постоянно собирается всякий хлам, папки,...

Запрет на удаление файлов/папок
Здравствуйте. Такая проблема: на компьютере есть два пользователя &quot;User&quot; и &quot;Admin&quot;. Задача состоит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru